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

如何在dplyr中分组/过滤计算p值及简化分组统计

问题解答

嘿,我来帮你搞定这两个问题!

1. 一次完成所有type类别的统计

你之前每次手动过滤type == x再运行统计,确实有点麻烦。其实只要把type也加入分组变量,就能一次性生成所有1-10类别的统计结果,不用重复跑10次代码啦。

用dplyr的话,代码可以这么写:

library(dplyr)

# 一次性计算所有type(1-10)和testno组合的中位数、IQR和样本量
result_all <- data %>%
  filter(type %in% 1:10) %>%  # 只保留需要的type类别,可选
  group_by(type, testno) %>%
  summarise(
    Median = median(tdif, na.rm = TRUE),  # 加上na.rm避免缺失值报错
    IQR = IQR(tdif, na.rm = TRUE),
    n = n(),
    .groups = 'drop'  # 取消分组,输出整洁的表格;如果要保留分组可以用'keep'
  )

这样运行一次,就能得到所有type和testno组合的统计结果,效率高多了。

2. 对分组/过滤组进行p值检验

首先得明确你想检验什么:默认你是想在每个type类别下,比较不同testno之间的tdif是否存在显著差异,给你两种常用的检验方案:

方案1:多组整体差异检验(Kruskal-Wallis)

因为你用了中位数和IQR,说明数据可能偏态,非参数检验更合适。Kruskal-Wallis检验可以判断同一type下,多个testno的tdif是否存在整体差异:

library(dplyr)
library(broom)  # 用来整理检验结果为表格格式

# 每个type下,检验不同testno的tdif是否有显著差异
kw_test_results <- data %>%
  filter(type %in% 1:10) %>%
  group_by(type) %>%
  do(tidy(kruskal.test(tdif ~ testno, data = .))) %>%
  ungroup()

结果表格里会包含每个type的卡方值、自由度和p值,帮你判断组间是否存在差异。

方案2:两两组间比较(Wilcoxon秩和检验)

如果Kruskal-Wallis检验显示有差异,你可能还想知道具体哪两个testno之间有差异。这时候可以用两两Wilcoxon检验,记得加上多重比较的p值调整:

pairwise_test_results <- data %>%
  filter(type %in% 1:10) %>%
  group_by(type) %>%
  do(tidy(pairwise.wilcox.test(.$tdif, .$testno, p.adjust.method = "bonferroni"))) %>%
  ungroup()

这里p.adjust.method = "bonferroni"是常用的多重比较校正方法,你也可以换成"holm"或其他方法,根据需求选择。

如果你的数据是正态分布的,也可以用ANOVA和两两t检验,但考虑到你用了中位数和IQR,非参数检验会更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:04:34