如何应用返回所有数据组合的函数

时间:2014-08-13 11:59:27

标签: r

我有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函数的方法?

感谢

5 个答案:

答案 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