邓恩的测试循环遍历数据框的列
dunn's test to loop over columns of a data-frame
我正在尝试对 Iris 数据执行 Dunn 检验。我想遍历 4 列并对不同物种的每一列执行 Dunn 测试。
但是,当我尝试获取列名时它不起作用。谁能告诉我为什么?
library(rstatix)
data<-iris
for (i in seq(1:4)) {
a<-colnames(data)
colname1 <-as.character(a[5])
colname2 <-as.character(a[i])
dtest<-data %>%
dunn_test( get(colname2) ~ get(colname1), p.adjust.method = "BH")
print(dtest)
print(i)
}
您可以使用 lapply
遍历列名并使用 reformulate
创建公式对象。使用 iris
数据集,您可以执行以下操作:
colname1 <- names(iris)[5]
colname2 <- names(iris)[1:4]
data <- lapply(colname2, function(x) {
rstatix::dunn_test(iris, reformulate(colname1, x),
p.adjust.method = "BH")
})
data
#[[1]]
# A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
#* <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
#1 Sepal.Length setosa versicolor 50 50 6.11 1.02e- 9 1.53e- 9 ****
#2 Sepal.Length setosa virginica 50 50 9.74 2.00e-22 6.00e-22 ****
#3 Sepal.Length versicolor virginica 50 50 3.64 2.77e- 4 2.77e- 4 ***
#[[2]]
# A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
#* <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
#1 Sepal.Width setosa versicolor 50 50 -7.79 6.82e-15 2.05e-14 ****
#2 Sepal.Width setosa virginica 50 50 -5.37 7.68e- 8 1.15e- 7 ****
#3 Sepal.Width versicolor virginica 50 50 2.41 1.58e- 2 1.58e- 2 *
#...
#...
dunn_test
想要一个公式,而您试图提供数据或两者的结合。您可以像这样修补 for
循环:
library("rstatix")
data <- iris
for (i in seq(1:4)) {
a <- colnames(data)
dtest <- dunn_test(data, as.formula(paste(a[i], a[5], sep="~")),
p.adjust.method="BH")
print(dtest)
print(i)
}
# # A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
# * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
# 1 Sepal~ setosa versi~ 50 50 6.11 1.02e- 9 1.53e- 9 ****
# 2 Sepal~ setosa virgi~ 50 50 9.74 2.00e-22 6.00e-22 ****
# 3 Sepal~ versic~ virgi~ 50 50 3.64 2.77e- 4 2.77e- 4 ***
# [1] 1
# [...]
另一种方法是使用reformulate
和Vectorize
它,以及dunn_test
功能。
dunn_testv <- Vectorize(dunn_test, vectorize.args="formula", SIMPLIFY=F)
reformulatev <- Vectorize(reformulate, vectorize.args="response")
res <- dunn_testv(iris, reformulatev("Species", names(iris)[1:4]), p.adjust.method="BH")
res
# $Sepal.Length
# # A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
# * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
# 1 Sepal~ setosa versi~ 50 50 6.11 1.02e- 9 1.53e- 9 ****
# 2 Sepal~ setosa virgi~ 50 50 9.74 2.00e-22 6.00e-22 ****
# 3 Sepal~ versic~ virgi~ 50 50 3.64 2.77e- 4 2.77e- 4 ***
# [...]
我正在尝试对 Iris 数据执行 Dunn 检验。我想遍历 4 列并对不同物种的每一列执行 Dunn 测试。 但是,当我尝试获取列名时它不起作用。谁能告诉我为什么?
library(rstatix)
data<-iris
for (i in seq(1:4)) {
a<-colnames(data)
colname1 <-as.character(a[5])
colname2 <-as.character(a[i])
dtest<-data %>%
dunn_test( get(colname2) ~ get(colname1), p.adjust.method = "BH")
print(dtest)
print(i)
}
您可以使用 lapply
遍历列名并使用 reformulate
创建公式对象。使用 iris
数据集,您可以执行以下操作:
colname1 <- names(iris)[5]
colname2 <- names(iris)[1:4]
data <- lapply(colname2, function(x) {
rstatix::dunn_test(iris, reformulate(colname1, x),
p.adjust.method = "BH")
})
data
#[[1]]
# A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
#* <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
#1 Sepal.Length setosa versicolor 50 50 6.11 1.02e- 9 1.53e- 9 ****
#2 Sepal.Length setosa virginica 50 50 9.74 2.00e-22 6.00e-22 ****
#3 Sepal.Length versicolor virginica 50 50 3.64 2.77e- 4 2.77e- 4 ***
#[[2]]
# A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
#* <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
#1 Sepal.Width setosa versicolor 50 50 -7.79 6.82e-15 2.05e-14 ****
#2 Sepal.Width setosa virginica 50 50 -5.37 7.68e- 8 1.15e- 7 ****
#3 Sepal.Width versicolor virginica 50 50 2.41 1.58e- 2 1.58e- 2 *
#...
#...
dunn_test
想要一个公式,而您试图提供数据或两者的结合。您可以像这样修补 for
循环:
library("rstatix")
data <- iris
for (i in seq(1:4)) {
a <- colnames(data)
dtest <- dunn_test(data, as.formula(paste(a[i], a[5], sep="~")),
p.adjust.method="BH")
print(dtest)
print(i)
}
# # A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
# * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
# 1 Sepal~ setosa versi~ 50 50 6.11 1.02e- 9 1.53e- 9 ****
# 2 Sepal~ setosa virgi~ 50 50 9.74 2.00e-22 6.00e-22 ****
# 3 Sepal~ versic~ virgi~ 50 50 3.64 2.77e- 4 2.77e- 4 ***
# [1] 1
# [...]
另一种方法是使用reformulate
和Vectorize
它,以及dunn_test
功能。
dunn_testv <- Vectorize(dunn_test, vectorize.args="formula", SIMPLIFY=F)
reformulatev <- Vectorize(reformulate, vectorize.args="response")
res <- dunn_testv(iris, reformulatev("Species", names(iris)[1:4]), p.adjust.method="BH")
res
# $Sepal.Length
# # A tibble: 3 x 9
# .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
# * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
# 1 Sepal~ setosa versi~ 50 50 6.11 1.02e- 9 1.53e- 9 ****
# 2 Sepal~ setosa virgi~ 50 50 9.74 2.00e-22 6.00e-22 ****
# 3 Sepal~ versic~ virgi~ 50 50 3.64 2.77e- 4 2.77e- 4 ***
# [...]