4

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

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

我想按 Speicies 拆分 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()三次,每个物种的 Petal.Lengths 一次?

4

2 回答 2

7

我可以看到两种方法,具体取决于您希望如何使用输出。shapiro.test您可以仅从in 中提取 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
于 2014-10-30T23:22:48.863 回答
2

如果您使用broom 包tidy()中的函数,将输出转换为 data.frame,那么您可以使用.shapiro.test()do()

iris %>%
  group_by(Species) %>%
  do(tidy(shapiro.test(.$Petal.Length)))

这给了你:

Source: local data frame [3 x 4]
Groups: Species [3]

Species statistic    p.value                      method
      <fctr>     <dbl>      <dbl>                      <fctr>
1     setosa 0.9549768 0.05481147 Shapiro-Wilk normality test
2 versicolor 0.9660044 0.15847784 Shapiro-Wilk normality test
3  virginica 0.9621864 0.10977537 Shapiro-Wilk normality test

这是改编自我的回答here

于 2017-01-13T14:48:14.233 回答