了解dplyr组与tapply组之间的结果差异
我希望在这两次运行之间看到相同的结果,但它们是不同的。这让我怀疑我是否真的理解dplyr代码是如何工作的(我已经阅读了包中和在线上关于dplyr的几乎所有内容)。有人能解释为什么结果不同,或者如何获得相似的结果吗了解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
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