ddply如何将因子作为"分裂"变量处理?

kmm*_*kmm 2 r plyr

我有一个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)
Run Code Online (Sandbox Code Playgroud)

输出是:

  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
Run Code Online (Sandbox Code Playgroud)

警告重复8次,大概每次拨打一次mean().我猜这是因为试图采取一个因素的平均值.我可以这样写:

ddply(df1, .(Aa, Bb), function(df1) mean(df1$x))
Run Code Online (Sandbox Code Playgroud)

要么

ddply(df1, .(Aa, Bb), summarize, x = mean(x))
Run Code Online (Sandbox Code Playgroud)

两者都有效(不给NAs),但我宁愿避免写出18个这样的x = mean(x)语句,每个数字列都有一个.

有一般解决方案吗?ddply如果在其他地方有更好的答案我就不会坚持.

42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用聚合同样容易.假设你有两个变量:

> 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
Run Code Online (Sandbox Code Playgroud)

  • 至于聚合除了自变量之外的所有变量,请尝试:aggregate(.~Aa + Bb,data = df1,mean) (2认同)