【问题标题】:understanding difference in results between dplyr group_by vs tapply了解 dplyr group_by 与 tapply 之间的结果差异
【发布时间】:2014-05-26 22:53:06
【问题描述】:

我期望在这两次运行之间看到相同的结果,但它们是不同的。让我质疑我是否真的了解 dplyr 代码的工作原理(我已经阅读了几乎所有关于 dplyr 的包和在线信息)。谁能解释为什么结果不同,或者如何获得相似的结果?

library(dplyr)
x <- iris
x <- x %.%
    group_by(Species, Sepal.Width) %.%
    summarise (freq=n()) %.%
    summarise (mean_by_group = mean(Sepal.Width))  
print(x)

x <- iris
x <- tapply(x$Sepal.Width, x$Species, mean)
print(x)

更新:我认为这不是最有效的方法,但以下代码给出了与 tapply 方法匹配的结果。根据 Hadley 的建议,我逐行检查了结果,这是我使用 dplyr 能想到的最好的结果

library(dplyr)
x <- iris
x <- x %.%
    group_by(Species, Sepal.Width) %.%
    summarise (freq=n()) %.%
    mutate (mean_by_group = sum(Sepal.Width*freq)/sum(freq)) %.%
print(x)

更新:出于某种原因,我认为我必须将要分析的所有变量分组,这就是将事情推向错误方向的原因。这就是我所需要的,它更接近包中的示例。

x <- iris %.%
    group_by(Species) %.%
    summarise(Sepal.Width = mean(Sepal.Width))
print(x)

【问题讨论】:

  • 提示:逐行处理您的 dplyr 代码。

标签: r group-by dplyr tapply


【解决方案1】:

也许这...

-dplyr:

require(dplyr)

iris %>% group_by(Species) %>% summarise(mean_width = mean(Sepal.Width))

  # Source: local data frame [3 x 2]
  #
  #      Species        mean_width
  # 1     setosa             3.428
  # 2 versicolor             2.770
  # 3  virginica             2.974

-tapply:

tapply(iris$Sepal.Width, iris$Species, mean)

  # setosa versicolor  virginica 
  # 3.428      2.770      2.974 

注意:tapply() 默认简化输出,而 summarise() 不会:

typeof(tapply(iris$Sepal.Width, iris$Species, mean, simplify=TRUE))

  # [1] "double"

否则返回list

typeof(tapply(iris$Sepal.Width, iris$Species, mean, simplify=FALSE))

  # [1] "list"

所以要真正获得相同类型的输出形式tapply(),您需要:

tbl_df( 
  data.frame( 
    mean_width = tapply( iris$Sepal.Width, 
                         iris$Species, 
                         mean )))

  # Source: local data frame [3 x 1]
  #
  #            mean_width
  # setosa          3.428
  # versicolor      2.770
  # virginica       2.974

这仍然不一样!因为unique(iris$Species) 在这里是attribute 而不是df 的列...

【讨论】:

  • 这行得通,我将其标记为答案,但您可能想补充一点,需要加载 magrittr 包以启用 %>%。我以前不熟悉那个包。
  • @MichaelBellhouse 编辑帖子以包含 require(dplyr) 行。 dplyr 在加载时导入magrittr 包的一小部分。感谢您的提醒。
  • 实际上,如果没有加载 magrittr,您的代码将无法为我运行:
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2014-03-19
相关资源
最近更新 更多