You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:57:31