使用每个()与reshape2 :: dcast聚合数据

时间:2012-03-11 22:35:35

标签: r aggregate-functions plyr reshape

我通常使用reshape包来汇总一些数据(呃),通常是plyr,因为它的功能非常棒each。最近,我收到了一个建议,要切换到reshape2并尝试一下,现在我似乎无法再使用each魔法。

重塑

> m <- melt(mtcars, id.vars = c("am", "vs"), measure.vars = "hp")
> cast(m, am + vs ~ variable, each(min, max, mean, sd))
  am vs hp_min hp_max   hp_mean    hp_sd
1  0  0    150    245 194.16667 33.35984
2  0  1     62    123 102.14286 20.93186
3  1  0     91    335 180.83333 98.81582
4  1  1     52    113  80.57143 24.14441

reshape2

require(plyr)
> m <- melt(mtcars, id.vars = c("am", "vs"), measure.vars = "hp")
> dcast(m, am + vs ~ variable, each(min, max, mean, sd))
Error in structure(ordered, dim = ns) : 
  dims [product 4] do not match the length of object [16]
In addition: Warning messages:
1: In fs[[i]](x, ...) : no non-missing arguments to min; returning Inf
2: In fs[[i]](x, ...) : no non-missing arguments to max; returning -Inf

我没有心情去梳理它,因为我之前的代码就像reshape的魅力一样,但我真的很想知道:

  1. 是否可以将eachdcast
  2. 一起使用
  3. 建议使用reshape2吗?被reshape弃用了吗?

1 个答案:

答案 0 :(得分:5)

第一个问题的答案似乎是。引自?reshape2:::dcast

  

如果您提供的变量组合不能唯一识别   在原始数据集中的一行,您将需要提供一个   聚合函数,fun.aggregate。这个功能应该采取   数字向量并返回单个摘要统计信息。

看看Hadley的reshape2的github页面表明他知道这个功能被删除了,但似乎认为在 plyr 中做得更好,大概是这样的:

ddply(m,.(am,vs),summarise,min = min(value),
                           max = max(value),
                           mean = mean(value),
                           sd = sd(value))

或者如果你真的想继续使用each

ddply(m,.(am,vs),function(x){each(min,max,mean,sd)(x$value)})