gpt4 book ai didi

r - 使用dplyr的group_by进行split-apply-combine

转载 作者:行者123 更新时间:2023-12-04 10:28:52 25 4
gpt4 key购买 nike

我正在尝试使用 dplyr执行以下操作:

 tapply(iris$Petal.Length, iris$Species, shapiro.test)

我想按物种分割 Petal.Lengths,并应用一个函数,在这种情况下 shapiro.test.我读了这个 SO question以及相当多的其他页面。我可以使用 do 将变量分成几组:
iris %>%
group_by(Species) %>%
select(Petal.Length) %>%
do(print(.$Petal.Length))

[1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2
[16] 1.5 1.3 1.4 1.7 1.5 1.7 1.5 1.0 1.7 1.9 1.6 1.6 1.5 1.4 1.6
[31] 1.6 1.5 1.5 1.4 1.5 1.2 1.3 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9
[46] 1.4 1.6 1.4 1.5 1.4
[1] 4.7 4.5 4.9 4.0 4.6 4.5 4.7 3.3 4.6 3.9 3.5 4.2 4.0 4.7 3.6
[16] 4.4 4.5 4.1 4.5 3.9 4.8 4.0 4.9 4.7 4.3 4.4 4.8 5.0 4.5 3.5
[31] 3.8 3.7 3.9 5.1 4.5 4.5 4.7 4.4 4.1 4.0 4.4 4.6 4.0 3.3 4.2
[46] 4.2 4.2 4.3 3.0 4.1

将列“拆分”成组似乎正在起作用。但是将碎片传递给 shapiro.test 的方法仍然让我感到困惑。我看到了 group_by与拆分不同。

我尝试了很多变体,包括:
iris %>%
group_by(Species) %>%
select(Petal.Length) %>%
summarise(shapiro.test)

并且
iris %>%
group_by(Species) %>%
select(Petal.Length) %>%
summarise_each(funs(shapiro.test))

# Error: expecting a single value

我该如何制作 dplyr运行 shapiro.test()三次,一次是每个物种的花瓣长度?

最佳答案

我可以看到两种方法来做到这一点,这取决于您想如何使用输出。您可以仅从 shapiro.test 中提取 p 值在 summarise .或者,您可以使用 do并将每个测试的结果保存在一个列表中。

library(dplyr)

summarise ,只提取 p 值:
iris %>%
group_by(Species) %>%
summarise(stest = shapiro.test(Petal.Length)$p.value)

Species stest
1 setosa 0.05481147
2 versicolor 0.15847784
3 virginica 0.10977537

使用 do :
tests = iris %>%
group_by(Species) %>%
do(test = shapiro.test(.$Petal.Length))

# Resulting list
tests$test

[[1]]

Shapiro-Wilk normality test

data: .$Petal.Length
W = 0.955, p-value = 0.05481


[[2]]

Shapiro-Wilk normality test

data: .$Petal.Length
W = 0.966, p-value = 0.1585


[[3]]

Shapiro-Wilk normality test

data: .$Petal.Length
W = 0.9622, p-value = 0.1098

关于r - 使用dplyr的group_by进行split-apply-combine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26664644/

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