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。
答案 0 :(得分:0)
一个选项是
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