繁体   English   中英

通过R中的索引变量汇总行

[英]Summing rows by index variable in R

我正在使用美国所有运输系统的数据库,并试图比较不同的机构。 每个案例都是组织的特定组成部分。 例如,公交线路与地铁分开。 我想结合给定代理机构所有案例的价值。

基本上,我想对每个“ Trs_Id”的每一列的值求和,然后删除其余的列。 此数据帧是运营费用的细分(“运营支出”)。 这是我的数据集在R中的样子:

> colnames(opex)
[1] "Trs_Id"                  "Mode_Cd"                
[3] "Service_Cd"              "Expense_Category_Desc"  
[5] "Op_Sal_Wage_Amt"         "Other_Sal_Wage_Amt"     
[7] "Fringe_Benefit_Amt"      "Service_Costs_Amt"      
[9] "Fuel_Lubricant_Amt"      "Tire_Tube_Amt"          
[11] "Other_Mat_Sup_Amt"       "Utility_Amt"            
[13] "Casuality_Liability_Amt" "Tax_Amt"                
[15] "In_Report_Amt"           "Sep_Report_Amt"         
[17] "Misc_Expense_Amt"        "Expense_Transfer_Amt"   
[19] "Ada_Related_Amt"        
> NROW(opex)
[1] 6956
> id_nm <- table(opex$Trs_Id)
> NROW(id_nm)
[1] 616

尽管您没有提供可再现的示例来演示您的问题,但我认为您可以使用plyr包中的ddply函数解决该问题,但是您也可以使用基本函数aggregate 我更喜欢用ddply

这是一些随机数,用于确定您的data.frame

 #install.packages('plyr')
 library(plyr)

 set.seed(007) # for the example being reproducible
 Mode_Cd1 <- replicate(4,sample(LETTERS[1:26], 1, replace=T)) # random genereation of variable Mode_Cd
 Mode_Cd2 <- replicate(4,sample(LETTERS[1:26], 1, replace=T)) 

 data_set <- data.frame(Trs_Id = rep(paste('00', 1:4, sep=''), each=3),
            Mode_Cd = sample(paste(Mode_Cd1, Mode_Cd2, sep=''), 12, replace=T),
            Service_Cd =  sample(paste(Mode_Cd2, Mode_Cd1, sep=''), 12, replace=T),
            Op_Sal_Wage_Amt = rnorm(12,5000,100),
            Other_Sal_Wage = rnorm(12,3000,800))

 data_set # this is how my random data_set looks like
   Trs_Id Mode_Cd Service_Cd Op_Sal_Wage_Amt Other_Sal_Wage
1     001      ZG         ID        4910.620       2213.558
2     001      KU         UK        4969.267       2779.149
3     001      ZG         ZB        4999.518       2303.319
4     002      ZG         ZB        5098.816       3574.968
5     002      BZ         ZB        5083.975       3088.522
6     002      ZG         GZ        5070.534       2937.227
7     003      KU         ID        5130.596       2663.608
8     003      ZG         UK        4861.200       2550.299
9     003      DI         ZB        5127.292       3798.011
10    004      ZG         UK        5018.419       2115.896
11    004      BZ         ID        5075.228       2886.170
12    004      KU         UK        5059.175       3251.996

 ddply(data_set,.(Trs_Id),numcolwise(sum)) # The sum you want.
  Trs_Id Op_Sal_Wage_Amt Other_Sal_Wage
1    001        14879.40       7296.026
2    002        15253.33       9600.717
3    003        15119.09       9011.918
4    004        15152.82       8254.062

使用Jilber的数据集,您还可以使用aggregate()处理此问题:

aggregate(data_set[, 4:5], list(data_set$Trs_Id), sum)

对于您的示例,列号将是5:19而不是4:5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM