通过R中的不同功能聚合不同的行

时间:2019-02-15 23:09:36

标签: r function aggregate summary

我有以下数据框: enter image description here

(用于测试波纹管的dput())

    structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "797 Fleet", class = "factor"), 
    V2 = structure(c(5L, 1L, 4L, 3L, 2L, 5L, 1L, 4L, 3L, 2L, 
    5L, 1L, 4L, 3L, 2L, 5L), .Label = c("Available Hours", "Cycle Time", 
    "Performance", "Production time", "Units"), class = "factor"), 
    V3 = c(51, 2989.601111, 2498.85, 540.8754973, 39.93337086, 
    52, 30010.73389, 24946.62833, 529.4659407, 40.81742793, 36, 
    20778.5525, 17174.18722, 535.7960907, 40.36234152, 19)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -16L))
我需要汇总数据,但要针对不同的功能使用不同的功能; 对于797机队,应增加单位和生产时间,但应平均性能和周期时间。

我刚刚尝试使用两个函数进行聚合,但是我得到了两列,一列全部相加,而另一列全部取平均值,我只需要一列。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我认为没有直接的方法可以实现聚合... 您首先需要使用感兴趣的功能创建单独的数据集,然后使用所需的功能进行汇总:

t1<-rbind(subset(test, test$V2=="Units"), subset(test, test$V2=="Production time"))
aggregate(.~V2, data=t1, sum)

答案 1 :(得分:1)

以下是使用data.table的想法:

library(data.table)
fun_list <- list("Units" = sum, "Production time" = sum, "Performance" = mean, "Cycle Time" = mean)
setDT(df)[V2 %in% names(fun_list), .(res = fun_list[[as.character(.BY[[2]])]](V3)),by = .(V1, V2)]

#          V1              V2         res
#1: 797 Fleet           Units   158.00000
#2: 797 Fleet Production time 44619.66555
#3: 797 Fleet     Performance   535.37918
#4: 797 Fleet      Cycle Time    40.37105

让我们稍微解开包装。首先,我们存储要应用于V2中每个值的函数的映射。该列表只是功能列表。例如。 "Units" = sum表示我们要将sum应用于"Units"组。要查看其工作原理,请尝试:fun_list[["Units"]](c(1,2,3))

然后我们通过data.table中的操作在我们的组中使用它。我们使用存储在V2中的.BY值来索引我们的函数列表。也就是说,对于每个V2值,我们从列表中选择一个要应用的函数。这是通过fun_list[[as.character(.BY[[2]])]]完成的(注意,由于as.character是一个因素,我们需要.BY)。最后,我们将该函数应用于V3,这是(V3)在代码fun_list[[as.character(.BY[[2]])]](V3))的最后一部分中所做的事情!

答案 2 :(得分:0)

这是一个使用split()将数据帧拆分为一个数据帧列表的解决方案,每个V2级别一个列表项(一个数据帧),然后分离lapply函数以使用所需的聚合函数创建汇总。最后,使用Reduce和rbind将所有内容重新组合在一起

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "797 Fleet", class = "factor"), 
               V2 = structure(c(5L, 1L, 4L, 3L, 2L, 5L, 1L, 4L, 3L, 2L, 
                                5L, 1L, 4L, 3L, 2L, 5L), .Label = c("Available Hours", "Cycle Time", 
                                                                    "Performance", "Production time", "Units"), class = "factor"), 
               V3 = c(51, 2989.601111, 2498.85, 540.8754973, 39.93337086, 
                      52, 30010.73389, 24946.62833, 529.4659407, 40.81742793, 36, 
                      20778.5525, 17174.18722, 535.7960907, 40.36234152, 19)),  .Names = c("V1", 
                                                                                           "V2", "V3"), class = "data.frame", row.names = c(NA, -16L))


df_list <- split(df, df$V2)


summary <- c(

  lapply(df_list[c("Units", "Production time")], 
       function(df) {aggregate(V3 ~ V1 + V2, data = df, sum)})
 ,
  lapply(df_list[c("Performance", "Cycle Time")], 
       function(df) {aggregate(V3 ~ V1 + V2, data = df, mean)})

   )

Reduce(rbind, summary)
#>          V1              V2          V3
#> 1 797 Fleet           Units   158.00000
#> 2 797 Fleet Production time 44619.66555
#> 3 797 Fleet     Performance   535.37918
#> 4 797 Fleet      Cycle Time    40.37105