【问题标题】:Different behaviors for dplyr versus plyr summarize() when "reusing" a variable in the summarize() call在 summarise() 调用中“重用”变量时,dplyr 与 plyr summarise() 的不同行为
【发布时间】:2014-07-18 07:21:39
【问题描述】:

当比较来自dplyrsummarize() 调用与使用plyr 的相同调用时,我找不到文档为什么会出现以下行为差异。差异归结为dplyrsummarize() 立即重用一个变量(不确定重用是否是正确的习惯用法)而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 版本中那样清楚地表明出了什么问题。

标签: r plyr dplyr


【解决方案1】:

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

你可以看到公式的分母会有0,这会导致NaN的结果。

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

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

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

【讨论】:

  • 嗨,Jaap,是的,这很清楚(现在)。问题是,我找不到任何 dplyr 正在重用变量。
  • 我同意它应该比代码的问题队列中记录得更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多