基于多分组拆分计算Wilcoxon检验并保留原始分组信息的简洁方法
解决方案:分组执行Wilcoxon秩和检验并保留分组信息
方法1:使用dplyr::reframe()(推荐,dplyr 1.1.0+)
reframe()是dplyr 1.1.0新增的函数,专门用于返回多行多列的分组统计结果,无需额外处理即可自动保留分组列,完美适配这类场景:
library(dplyr) library(broom) set.seed(22) # 创建模拟数据 flavor <- data.frame( temperature = sample(x = c('hot','cold'), size = 500, replace = TRUE), color = sample(c('red','blue','green'), 500, TRUE), texture = sample(c('crumbly', 'crispy', 'wet', 'soft'), 500, TRUE), flavor = sample.int(n = 100, size = 500, replace = TRUE) ) # 分组执行Wilcoxon检验并保留分组信息 flavor %>% group_by(color, texture) %>% reframe(wilcox.test(flavor ~ temperature, data = cur_data()) %>% tidy())
执行后会得到包含color、texture和检验统计量(statistic、p.value等)的完整结果,统计量计算准确,分组信息完整。
方法2:使用summarise() + tidyr::unnest()(兼容旧版dplyr)
如果你的dplyr版本低于1.1.0,可以通过嵌套列表列再展开的方式实现:
library(tidyr) flavor %>% group_by(color, texture) %>% # 用list()包裹检验结果,确保每个分组生成独立的列表元素 summarise(test_result = list(wilcox.test(flavor ~ temperature, data = cur_data()) %>% tidy()), .groups = "drop") %>% # 展开嵌套的结果列 unnest(test_result)
注意:之前的summarise()方法出错,是因为没有用list()包裹tidy()的输出,导致summarise()错误地将整个数据集的检验结果重复赋值给所有分组。用list()包裹后,每个分组会存储独立的检验结果,再通过unnest()展开即可得到正确结果。
方法3:使用group_split()并手动绑定分组信息
如果偏好使用group_split(),可以先提取分组键值,再与检验结果合并:
library(purrr) # 提取所有分组的标签信息 group_labels <- flavor %>% group_by(color, texture) %>% group_keys() # 分组执行检验并合并分组标签 flavor %>% group_split(color, texture) %>% map_dfr(~wilcox.test(flavor ~ temperature, data = .) %>% tidy()) %>% bind_cols(group_labels) %>% relocate(color, texture) # 将分组列移至结果开头
这种方法通过group_keys()提前获取分组标签,再与检验结果绑定,解决了group_split()丢失分组信息的问题。
错误原因回顾
- base split + map方法:仅按分组ID拆分,未保留分组标签信息;
- 原始summarise方法:未用
list()包裹检验结果,导致summarise()未按分组处理,重复输出全局检验结果; - group_split方法:拆分后的列表元素不携带分组标签,需手动提取合并。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

