当在summary()调用中“重用”变量时,dplyr与plyr的不同行为总结()

时间:2014-07-18 07:21:40

标签: r plyr dplyr

我无法找到文档为什么在使用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()

1 个答案:

答案 0 :(得分:2)

如你所说,dplyr重用变量。因此,您的初始代码尝试从一个值计算标准偏差。当您查看标准差的公式时:

enter image description here

您可以看到公式的分母将为0,从而导致NaN结果。

在第二个dplyr代码中,标准偏差是从原始变量计算出来的。由于计算sd的组具有n > 1,因此在这种情况下,分母大于零,这将导致sd值。

dplyr只接受最后创建的变量实例。在链接到@baptiste的页面中,您可以找到this statement of Hadley Wickham,从中您可以得出结论,在创建新变量时最好使用新名称。

我认为应该在文档中明确说明这种行为。