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

基于多分组拆分计算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()丢失分组信息的问题。


错误原因回顾

  1. base split + map方法:仅按分组ID拆分,未保留分组标签信息;
  2. 原始summarise方法:未用list()包裹检验结果,导致summarise()未按分组处理,重复输出全局检验结果;
  3. group_split方法:拆分后的列表元素不携带分组标签,需手动提取合并。

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:35:21