Как показать несколько результатов теста одного и того же data.frame в сводной таблице - PullRequest
2 голосов
/ 10 мая 2019

Набор данных iris (встроенный в R) включает 50 наблюдений, каждое наблюдение имеет данные Sepal.Length, Sepal.Width, Petal.Length и Petal.Width. Я хочу использовать несколько тестов (Shapiro.test, ks.test, cvm.test, ad.test,), чтобы проверить нормальность каждого столбца и показать результат в таблице.

Код ниже показывает результат с использованием только одного теста.

dat <- iris %>%
  filter(Species == "setosa")

df <- dat %>%
  select(-Species)
test <- lapply(df, shapiro.test)
table <- sapply(test, `[`,c("statistic","p.value"))
table
R > 
$Sepal.Length.p.value
[1] 0.4595132

$Sepal.Width.p.value
[1] 0.2715264

$Petal.Length.p.value
[1] 0.05481147

$Petal.Width.p.value
[1] 8.658573e-07

Я хочу обобщить и сравнить различные тесты в одной таблице, где строка представляет разные тесты, а столбец представляет Sepal.Length, Sepal.Width, Petal.Length и Petal.Width.

1 Ответ

0 голосов
/ 10 мая 2019

Один из вариантов будет

library(nortest)
out <- lapply(c("shapiro.test", "cvm.test", "ad.test"), 
    function(x) sapply(df, function(y) get(x)(y)[c("statistic", "p.value")]))
do.call(rbind, Map(cbind, test = c("shapiro.test", "cvm.test", "ad.test"), out))

Или с использованием tidyverse

library(tidyverse)
lst(shapiro.test, cvm.test, ad.test) %>% 
   map_df(~ df  %>% 
             summarise_all(list(~ list(.x(.)[c("statistic", "p.value")]))) %>% 
             unnest, .id = "test")

Если нам не нужен перехват

lst(shapiro.test, cvm.test, ad.test) %>%
      map_df(~ df  %>% 
           summarise_all(list(~ list(.x(.)[c("statistic", "p.value")][2]))) %>%
           unnest, .id = "test")
#          test Sepal.Length Sepal.Width Petal.Length  Petal.Width
#1 shapiro.test    0.4595132   0.2715264   0.05481147 8.658573e-07
#2     cvm.test    0.2596871   0.2324437  0.006874393 1.717773e-09
#3      ad.test    0.3352439   0.2101787   0.01079067 7.437223e-12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...