0

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

基本上我想对每个“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
4

2 回答 2

4

尽管您没有制作可重现的示例来证明您的问题,但我认为您可以使用package 中的ddplyfunction来解决它plyr,但您也可以使用 base function 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
于 2012-08-06T16:12:24.210 回答
2

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

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

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

于 2012-08-07T02:21:26.690 回答