【发布时间】:2014-07-18 07:21:39
【问题描述】:
当比较来自dplyr 的summarize() 调用与使用plyr 的相同调用时,我找不到文档为什么会出现以下行为差异。差异归结为dplyr 的summarize() 立即重用一个变量(不确定重用是否是正确的习惯用法)而plyr 的版本更像是(至少)我拥有的概念模型函数。
(dfr <- data.frame(a=gl(3,3, labels=letters[1:3]), b=c(1:3, rep(NA_integer_, 3), 1:2, NA_integer_)))
ddply(dfr, .(a), summarize, b=mean(b, na.rm=TRUE), s=sd(b, na.rm=TRUE))
a b s
1 a 2.0 1.1547005
2 b NaN 0.0000000
3 c 1.5 0.8660254
正如我所料:ddply() 基本上是在a 指示的部分中表示取dfr,然后首先计算平均值,然后计算特定变量的标准差。
但是,当我改用 dplyr 时,我得到了这个:
dfr %>% group_by(a) %>% summarize(b=mean(b, na.rm=TRUE), s=sd(b, na.rm=TRUE))
Source: local data frame [3 x 3]
a b s
1 a 2.0 NaN
2 b NaN NaN
3 c 1.5 NaN
所以这说在a 指示的块中取dfr,然后首先计算变量b 的平均值,然后使用该平均值计算sd(即s 实际上是sd(mean(b))) .
我无法找到两个 plyr 软件包之间存在这种差异的方式/原因的提示。而且,确实,上述调用的编码风格相当欠佳,下面的代码可以正常工作。尽管如此,在我看来,summarize() 在两个包之间的工作方式非常不同,因此需要在帮助页面的某个地方明确指出。
dfr %>% group_by(a) %>% summarize(m=mean(b, na.rm=TRUE), s=sd(b, na.rm=TRUE))
Source: local data frame [3 x 3]
a m s
1 a 2.0 1.0000000
2 b NaN NaN
3 c 1.5 0.7071068
【问题讨论】:
-
实际上,直到现在我重新阅读我的帖子时,我才看到
ddply调用给出了错误的 sd 作为结果。因此,即使我给summarize打电话也有一些可疑的地方。现在,不幸的是,它不像在 dplyr 版本中那样清楚地表明出了什么问题。