了解dplyr组与tapply组之间的结果差异

了解dplyr组与tapply组之间的结果差异,r,group-by,dplyr,tapply,R,Group By,Dplyr,Tapply,我希望在这两次运行之间看到相同的结果,但它们是不同的。这让我怀疑我是否真的理解dplyr代码是如何工作的(我已经阅读了包中和在线上关于dplyr的几乎所有内容)。有人能解释为什么结果不同,或者如何获得相似的结果吗 library(dplyr) x <- iris x <- x %.% group_by(Species, Sepal.Width) %.% summarise (freq=n()) %.% summarise (mean_by_group = me

我希望在这两次运行之间看到相同的结果,但它们是不同的。这让我怀疑我是否真的理解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)
库(dplyr)
也许这

-
dplyr
: -
tapply

注意:
tapply()
默认情况下简化了输出,而
summary()
没有: 它返回一个
列表
,否则:

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)
在这里是一个
属性,而不是df的一列…

提示:逐行处理您的dplyr代码。这是有效的,我将其标记为答案,但您可能需要添加需要加载magrittr包才能启用%>%。我以前不熟悉那个软件包。@MichaelBellhouse编辑了这篇文章,其中包括
require(dplyr)
line。dplyr在加载时导入一小部分
magrittr
包。谢谢提醒。实际上,如果没有加载magrittr,您的代码将无法为我运行:
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(iris$Sepal.Width, iris$Species, mean)

  # setosa versicolor  virginica 
  # 3.428      2.770      2.974 
typeof(tapply(iris$Sepal.Width, iris$Species, mean, simplify=TRUE))

  # [1] "double"
typeof(tapply(iris$Sepal.Width, iris$Species, mean, simplify=FALSE))

  # [1] "list"
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