gpt4 book ai didi

r - 了解 dplyr group_by 与 tapply 之间的结果差异

转载 作者:行者123 更新时间:2023-12-01 23:55:50 28 4
gpt4 key购买 nike

我原本期望在这两次运行之间看到相同的结果,但它们是不同的。让我怀疑我是否真的了解 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:

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

注意: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 的列...

关于r - 了解 dplyr group_by 与 tapply 之间的结果差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878678/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com