我有一个包含20列的data.frame。前两个是因子,其余是数字。我想将前两列用作拆分变量,然后将mean()
应用于其余列。
对于ddply()
来说,这似乎是一项快速而简单的工作,但是输出data.frame的结果并不是我想要的。这是一个只有一列数据的最小例子:
Aa <- c(rep(c("A", "a"), each = 20))
Bb <- c(rep(c("B", "b", "B", "b"), each = 10))
x <- runif(40)
df1 <- data.frame(Aa, Bb, x)
ddply(df1, .(Aa, Bb), mean)
输出结果为:
Aa Bb x
1 NA NA 0.5193275
2 NA NA 0.4491907
3 NA NA 0.4848128
4 NA NA 0.4717899
Warning messages:
1: In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA
警告重复8次,大概每次拨打mean()
一次。我猜这是因为试图采取一个因素的平均值。我可以这样写:
ddply(df1, .(Aa, Bb), function(df1) mean(df1$x))
或
ddply(df1, .(Aa, Bb), summarize, x = mean(x))
这两个都有效(不给NAs),但我宁愿避免写出18个这样的x = mean(x)
语句,每个数字列都有一个。
有一般解决方案吗?如果在其他地方有更好的答案,我就不会与ddply
结婚。
答案 0 :(得分:6)
由于您要减少行数,因此需要使用summarise
:
> ddply(df1, .(Aa, Bb), summarise, mean_x =mean(x) )
Aa Bb mean_x
1 a b 0.3790675
2 a B 0.4242922
3 A b 0.5622329
4 A B 0.4574471
在这种情况下使用聚合同样容易。假设您有两个变量:
> aggregate(df1[-(1:2)], df1[1:2], mean)
Aa Bb x y
1 a b 0.4249121 0.4639192
2 A b 0.6127175 0.4639192
3 a B 0.4522292 0.4826715
4 A B 0.5201965 0.4826715
答案 1 :(得分:2)
ddply
也支持否定索引:
ddply(df1, .(Aa, Bb), function(x) mean(x[-(1:2)]))