如何将数据框架汇总成一个新的数据框,告诉单独的级别?

时间:2015-09-26 09:07:00

标签: r sorting dataframe

我有一个看起来有点像这样的data.frame。

k <- data.frame(id = c(1,2,2,1,2,1,2,2,1,2), act = c('a','b','d','c','d','c','a','b','a','b'), var1 = 25:34, var2= 74:83)

我必须通过前2列将数据分组到不同的级别,并写下接下来的2列(var1和var2)的平均值。看起来应该是这样的

     id act varmean1 varmean2

  1   1   a         
  2   1   c        
  3   2   a        
  4   2   b        
  5   2   b        
  6   2   d       

各个均值的值填写在varmean1和varmean2中。

我的实际数据框有88列,我必须通过前2列将数据分组到不同的级别,并找到剩余的各自的方法。请尽快帮我解决这个问题。如果可能,请尝试使用'dplyr'软件包作为解决方案。感谢。

1 个答案:

答案 0 :(得分:2)

您有几种选择:

基础R:

aggregate(. ~ id + act, k, mean)

aggregate(cbind(var1, var2) ~ id + act, k, mean)

第一个选项按idact汇总所有列,第二个选项仅汇总您指定的列。在这种情况下,两者都给出了相同的结果,但是知道何时有更多列并且只想聚合其中的一些是很好的。

<强> dplyr:

library(dplyr)
k %>%
  group_by(id, act) %>% 
  summarise_each(funs(mean))

如果您要指定要计算平均值的列,可以使用summarise代替summarise_each

k %>%
  group_by(id, act) %>% 
  summarise(var1mean = mean(var1), var2mean = mean(var2))

<强> data.table:

library(data.table)
setDT(k)[, lapply(.SD, mean), by = .(id, act)]

如果要指定要计算平均值的列,可以添加.SDcols,如:

setDT(k)[, lapply(.SD, mean), by = .(id, act), .SDcols=c("var1", "var2")]