我期待在这两次运行之间看到相同的结果,并且它们是不同的。如果我真的明白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)
答案 0 :(得分:3)
也许这......
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的列......