我有一个看起来有点像这样的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'软件包作为解决方案。感谢。
答案 0 :(得分:2)
您有几种选择:
基础R:
aggregate(. ~ id + act, k, mean)
或
aggregate(cbind(var1, var2) ~ id + act, k, mean)
第一个选项按id
和act
汇总所有列,第二个选项仅汇总您指定的列。在这种情况下,两者都给出了相同的结果,但是知道何时有更多列并且只想聚合其中的一些是很好的。
<强> 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")]