基于col1分组,实现col2各组与其余组的Wilcoxon检验
解决方法
你可以通过 group_modify 配合 map_dfr 实现需求,具体代码如下:
library(tidyverse) # 生成示例数据 df <- data.frame(x=abs(rnorm(50)),col1=rep(1:5,10), col2=rep(1:4,25)) # 计算每个col1分组内,col2各组与其余组的Wilcoxon检验p值 result <- df %>% group_by(col1) %>% group_modify(function(group_data, group_key) { # 获取当前col1分组下所有唯一的col2值 col2_groups <- unique(group_data$col2) # 遍历每个col2分组,计算p值并组合成结果表 map_dfr(col2_groups, function(g) { # 提取当前col2分组的x值,以及其余分组的x值 x_group <- group_data$x[group_data$col2 == g] x_others <- group_data$x[group_data$col2 != g] # 执行Wilcoxon秩和检验并提取p值 p_val <- wilcox.test(x_group, x_others)$p.value # 返回当前分组的结果行 tibble(col2 = g, p_value = p_val) }) }) %>% ungroup() # 查看结果 print(result)
代码说明:
group_by(col1):将数据按col1分组,后续操作在每个col1分组内独立执行。group_modify:对每个col1分组应用自定义函数,group_data为当前分组的数据集,group_key包含当前分组的col1值。unique(group_data$col2):获取当前col1分组下所有不重复的col2取值,确保每个col2分组都被处理。map_dfr:遍历每个col2分组g,执行检验并将结果按行绑定成数据框:- 分别筛选出
col2 == g和col2 != g对应的x值; - 调用
wilcox.test完成秩和检验,提取p.value; - 用
tibble生成包含col2和p_value的结果行。
- 分别筛选出
ungroup():移除分组属性,得到最终的平级结果表。
最终得到的result包含你需要的三列:col1、col2和对应的p_value。
内容的提问来源于stack exchange,提问作者Algorithman
相关产品推荐
相关产品推荐

