我无法找到文档为什么在使用summarize()
将来自dplyr
的{{1}}来电与使用plyr
的同一来电进行比较时,会出现以下行为差异。差异归结为dplyr
' s summarize()
立即重用变量(不确定重用是否是正确的习惯用法),而plyr
的版本更像(至少)我有其功能的概念模型(ing)。
(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()
基本上在dfr
指示的部分中显示取a
,然后首先计算特定变量的均值,然后计算特定变量的sd。
然而,当我使用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
所以这表示在dfr
指示的块中取a
然后首先计算变量b
的平均值,然后使用该均值来计算sd(即{{1}实际上是s
)。
我无法找到这两个plyr包之间存在差异的原因。实际上,上述调用的编码风格相当不理想,下面的代码可以正常工作。然而,在我看来,sd(mean(b))
两个软件包之间的工作方式完全不同,需要在帮助页面的某处明确指出。
summarize()
答案 0 :(得分:2)
如你所说,dplyr
重用变量。因此,您的初始代码尝试从一个值计算标准偏差。当您查看标准差的公式时:
您可以看到公式的分母将为0
,从而导致NaN
结果。
在第二个dplyr
代码中,标准偏差是从原始变量计算出来的。由于计算sd
的组具有n > 1
,因此在这种情况下,分母大于零,这将导致sd
值。
dplyr
只接受最后创建的变量实例。在链接到@baptiste的页面中,您可以找到this statement of Hadley Wickham,从中您可以得出结论,在创建新变量时最好使用新名称。
我认为应该在文档中明确说明这种行为。