我通常使用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
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
的魅力一样,但我真的很想知道:
each
与dcast
?reshape2
吗?被reshape
弃用了吗?答案 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)})