R:Kruskal-Wallis 测试循环遍历数据框中的指定列
R: Kruskal-Wallis test in loop over specified columns in data frame
我想 运行 使用一个分组变量对数据框中的某些数值变量进行 KW 测试。我更喜欢在循环中执行此操作,而不是输入所有测试,因为它们有很多变量(比下面的示例更多)。
模拟数据:
library(dplyr)
set.seed(123)
Data <- tbl_df(
data.frame(
muttype = as.factor(rep(c("missense", "frameshift", "nonsense"), each = 80)),
ados.tsc = runif(240, 0, 10),
ados.sa = runif(240, 0, 10),
ados.rrb = runif(240, 0, 10))
) %>%
group_by(muttype)
ados.sim <- as.data.frame(Data)
下面的代码在循环外工作得很好。
kruskal.test(formula (paste((colnames(ados.sim)[2]), "~ muttype")), data =
ados.sim)
但它不在循环内:
for(i in names(ados.sim[,2:4])){
ados.mtp <- kruskal.test(formula (paste((colnames(ados.sim)[i]), "~ muttype")),
data = ados.sim)
}
我收到错误:
terms.formula(公式,数据=数据)错误:
模型公式中的无效项
谁知道如何解决这个问题?
非常感谢!!
尝试:
results <- list()
for(i in names(ados.sim[,2:4])){
results[[i]] <- kruskal.test(formula(paste(i, "~ muttype")), data = ados.sim)
}
这还会将您的结果保存在列表中,并避免在每次迭代中将您的结果覆盖为 ados.mtp
,我认为这不是您想要做的。
注意以下几点:
for(i in names(ados.sim[,2:4])){
print(i)
}
[1] "ados.tsc"
[1] "ados.sa"
[1] "ados.rrb"
也就是说,i
已经为您提供了列的名称。您的代码中的问题是您试图像使用整数一样使用它来进行子集化,这将结果变成了 NA
。
for(i in names(ados.sim[,2:4])){
print(paste((colnames(ados.sim)[i]), "~ muttype"))
}
[1] "NA ~ muttype"
[1] "NA ~ muttype"
[1] "NA ~ muttype"
仅供参考,所有这些也可以通过以下两种我经常喜欢的方式完成,因为它可以使后续分析稍微容易一些:
首先,将所有测试对象存储在数据框中:
library(tidyr)
df <- ados.sim %>% gather(key, value, -muttype) %>%
group_by(key) %>%
do(test = kruskal.test(x= .$value, g = .$muttype))
然后您可以对数据帧进行子集化以获得测试结果:
df[df$key == "ados.rrb",]$test
[[1]]
Kruskal-Wallis rank sum test
data: .$value and .$muttype
Kruskal-Wallis chi-squared = 2.2205, df = 2, p-value = 0.3295
或者,直接在数据框中获取所有结果,而不存储测试对象:
library(broom)
df2 <- ados.sim %>% gather(key, value, -muttype) %>%
group_by(key) %>%
do(tidy(kruskal.test(x= .$value, g = .$muttype)))
df2
# A tibble: 3 x 5
# Groups: key [3]
key statistic p.value parameter method
<chr> <dbl> <dbl> <int> <fctr>
1 ados.rrb 2.2205031 0.3294761 2 Kruskal-Wallis rank sum test
2 ados.sa 0.1319554 0.9361517 2 Kruskal-Wallis rank sum test
3 ados.tsc 0.3618102 0.8345146 2 Kruskal-Wallis rank sum test
我想 运行 使用一个分组变量对数据框中的某些数值变量进行 KW 测试。我更喜欢在循环中执行此操作,而不是输入所有测试,因为它们有很多变量(比下面的示例更多)。
模拟数据:
library(dplyr)
set.seed(123)
Data <- tbl_df(
data.frame(
muttype = as.factor(rep(c("missense", "frameshift", "nonsense"), each = 80)),
ados.tsc = runif(240, 0, 10),
ados.sa = runif(240, 0, 10),
ados.rrb = runif(240, 0, 10))
) %>%
group_by(muttype)
ados.sim <- as.data.frame(Data)
下面的代码在循环外工作得很好。
kruskal.test(formula (paste((colnames(ados.sim)[2]), "~ muttype")), data =
ados.sim)
但它不在循环内:
for(i in names(ados.sim[,2:4])){
ados.mtp <- kruskal.test(formula (paste((colnames(ados.sim)[i]), "~ muttype")),
data = ados.sim)
}
我收到错误:
terms.formula(公式,数据=数据)错误: 模型公式中的无效项
谁知道如何解决这个问题? 非常感谢!!
尝试:
results <- list()
for(i in names(ados.sim[,2:4])){
results[[i]] <- kruskal.test(formula(paste(i, "~ muttype")), data = ados.sim)
}
这还会将您的结果保存在列表中,并避免在每次迭代中将您的结果覆盖为 ados.mtp
,我认为这不是您想要做的。
注意以下几点:
for(i in names(ados.sim[,2:4])){
print(i)
}
[1] "ados.tsc"
[1] "ados.sa"
[1] "ados.rrb"
也就是说,i
已经为您提供了列的名称。您的代码中的问题是您试图像使用整数一样使用它来进行子集化,这将结果变成了 NA
。
for(i in names(ados.sim[,2:4])){
print(paste((colnames(ados.sim)[i]), "~ muttype"))
}
[1] "NA ~ muttype"
[1] "NA ~ muttype"
[1] "NA ~ muttype"
仅供参考,所有这些也可以通过以下两种我经常喜欢的方式完成,因为它可以使后续分析稍微容易一些:
首先,将所有测试对象存储在数据框中:
library(tidyr)
df <- ados.sim %>% gather(key, value, -muttype) %>%
group_by(key) %>%
do(test = kruskal.test(x= .$value, g = .$muttype))
然后您可以对数据帧进行子集化以获得测试结果:
df[df$key == "ados.rrb",]$test
[[1]]
Kruskal-Wallis rank sum test
data: .$value and .$muttype
Kruskal-Wallis chi-squared = 2.2205, df = 2, p-value = 0.3295
或者,直接在数据框中获取所有结果,而不存储测试对象:
library(broom)
df2 <- ados.sim %>% gather(key, value, -muttype) %>%
group_by(key) %>%
do(tidy(kruskal.test(x= .$value, g = .$muttype)))
df2
# A tibble: 3 x 5
# Groups: key [3]
key statistic p.value parameter method
<chr> <dbl> <dbl> <int> <fctr>
1 ados.rrb 2.2205031 0.3294761 2 Kruskal-Wallis rank sum test
2 ados.sa 0.1319554 0.9361517 2 Kruskal-Wallis rank sum test
3 ados.tsc 0.3618102 0.8345146 2 Kruskal-Wallis rank sum test