如何在R中批量对数据框的A、B组合执行Kruskal-Wallis检验?
问题描述
我在R中有一个数据框df,其中包含50组A、B的唯一组合。我希望为每组A、B组合执行Kruskal-Wallis检验(用于判断不同C分组下D的分布是否存在差异),以此确定哪些组合需要拒绝原假设。如何无需逐个手动执行检验即可完成此操作?
数据样例:
A B C D mix1 size1 1 0.2 mix1 size1 2 0.15 mix1 size1 3 0.22 mix1 size1 4 0.215 mix2 size1 1 0.2 mix2 size1 2 0.15 mix2 size1 3 0.2 mix2 size1 4 0.15 mix2 size2 1 0.21 mix2 size2 2 0.11 mix2 size2 3 0.23 mix2 size2 4 0.615 ... mix22 size1 1 0.01 mix22 size1 2 0.18 mix22 size1 3 0.7 mix22 size1 4 0.17
期望得到包含每组A、B组合对应Kruskal-Wallis检验p值的数据框,样例如下:
A B P mix1 size1 0.005 mix2 size1 0.211
是否可以使用*apply系列函数实现?
解决方案
方法1:用dplyr分组处理(推荐,代码更简洁直观)
借助dplyr的分组功能,结合检验函数快速批量计算p值,还可以用broom包将检验结果整理成标准数据框格式:
# 加载所需包 library(dplyr) library(broom) # 按A、B组合分组,计算每组的Kruskal-Wallis检验p值 result_df <- df %>% group_by(A, B) %>% summarize( P = kruskal.test(D ~ C, data = cur_data())$p.value, .groups = "drop" # 取消分组状态,生成普通数据框 ) # 查看结果 print(result_df)
注:kruskal.test(D ~ C, data = cur_data())等价于kruskal.test(cur_data()$D, cur_data()$C),前者用公式形式更清晰表达“以C为分组变量检验D的分布差异”的逻辑。
方法2:用*apply系列函数实现
通过split拆分数据,再用lapply遍历子集执行检验,最后整理结果:
# 按A、B的组合拆分数据框,drop=TRUE自动丢弃空组合 split_df <- split(df, list(df$A, df$B), drop = TRUE) # 遍历每个子集,计算Kruskal-Wallis检验的p值 p_values <- lapply(split_df, function(sub_df) { kruskal.test(sub_df$D, sub_df$C)$p.value }) # 将结果转换为数据框并整理格式 result_df <- data.frame( P = unlist(p_values), row.names = names(p_values) ) # 从行名中拆分出A、B的取值 result_df$A <- sapply(strsplit(rownames(result_df), "\\."), "[", 1) result_df$B <- sapply(strsplit(rownames(result_df), "\\."), "[", 2) # 调整列顺序为A、B、P result_df <- result_df[, c("A", "B", "P")] # 查看结果 print(result_df)
内容的提问来源于stack exchange,提问作者Timo V
相关产品推荐
相关产品推荐

