r - 当我使用 ANOVA (R) 运行 for 循环时,为什么会收到消息“'names' attribute must be the same length as vector”?

我正在尝试创建一个运行 ANOVA 的 for 循环。我有一个需要运行 ANOVA 的数据框列表,我想创建一个包含结果 p-values 的列表。但是,当我运行 for 循环时,我收到以下消息:

'names' attribute [5] must be the same length as the vector [3]

这是我使用的代码:

##split my dataframe into a list of dataframes based on what gene the data represents
gene_data_list <- split(df_test, f = df_test$Gene)

##create an empty list to collect p-values
p_values <- list()

##run ANOVA on the list of dataframes
for(i in 1:length(gene_data_list)) {
  anova <- aov(value ~ variable, data = gene_data_list[[i]])
  summary <- anova_summary(anova)
  append(p_values, summary$p)
}

当我在循环外的 gene_data_list[[1]] 上运行相同的代码时,它运行良好。我附上了我一直在使用的数据框的链接:https://easyupload.io/z5avik

回答1

您可以通过使用 lapply 而不是 for 循环的稍微简单的编码来完成所有这些操作:

df_test <- read.csv("Test_dataset.csv")
gene_data_list <- split(df_test, f = df_test$Gene)

# Run ANOVAs
gene_anova <- lapply(gene_data_list, function(x) aov(value ~ variable, data = x))

# Get summaries
summary_list <- lapply(gene_anova, rstatix::anova_summary)

# Create single table
results_table <- do.call(rbind, summary_list)

输出:

head(results_table)

# Effect DFn DFd          F     p p<.05     ges
# 1          1   2  24 1.3570e+00 0.276     1 0.10200
# AAGAB      1   2  15 1.9334e+27 0.000     2 1.00000
# AAK1       1   2  42 4.0000e-03 0.997     1 0.00017
# AAMDC      1   2   6 4.4182e+29 0.000     2 1.00000
# AATF       1   2  24 8.5433e+28 0.000     2 1.00000
# ABCA2      1   2  33 1.0470e+00 0.362     1 0.06000

请注意,如果您只想要 p values 的列表,您可以这样做

p_list <- lapply(gene_anova, function(x) rstatix::anova_summary(x)$p)

它为您提供了一个列表,其中每个位置为 p value

相似文章

最新文章