我有data.frame
:
df <- data.frame(group=c(rep("group1",12), rep("group2",12)),
variable=c(rep("var1",4), rep("var2",4), rep("var3",4)),
value=sample(24))
我想申请一个函数,比如说,意思是。所以我可以得到一个矩阵(2 x 3),每个变量都有每个组的平均值。
我尝试使用tapply
,但它没有返回我需要的内容。是否有另一种使用apply函数的方法?
感谢
答案 0 :(得分:2)
tapply确实有效,并提供最简单的代码:
with(df, tapply(value, list(group,variable), mean))
var1 var2 var3
group1 8.5 14.0 14
group2 8.0 18.5 12
答案 1 :(得分:1)
使用plyr包中的ddply
require(plyr)
ddply(df, .(group, variable), summarize, m=mean(value))
给出
group variable m
1 group1 var1 15.00
2 group1 var2 9.25
3 group1 var3 13.50
4 group2 var1 6.50
5 group2 var2 20.00
6 group2 var3 10.75
你可以重塑这个
reshape(res, idvar="group", timevar="variable", direction="wide")
并获得
group m.var1 m.var2 m.var3
1 group1 15.0 9.25 13.50
4 group2 6.5 20.00 10.75
答案 2 :(得分:1)
我会在评论中使用@ rawr的答案。这是by
的另一种方式:
rbind(by(df, list(df$group, df$variable), function(x) { mean(x$value) }))
## var1 var2 var3
## group1 13.75 16.50 14
## group2 9.50 8.25 13
答案 3 :(得分:1)
或
library(reshape2)
dcast(df, group ~ variable, value.var = "value", fun.aggregate = mean)
## group var1 var2 var3
## 1 group1 12.25 12.5 10.25
## 2 group2 17.25 10.5 12.25
答案 4 :(得分:1)
另一种选择:
library(dplyr)
library(tidyr)
df %>%
group_by(group, variable) %>%
summarize(meanValue = mean(value)) %>%
spread(variable, meanValue)
#Source: local data frame [2 x 4]
#
# group var1 var2 var3
#1 group1 17.25 9.75 14.25
#2 group2 16.00 4.75 13.00