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

如何将TukeyHSD结果的分组列拆分为Group1/Group2数据框?

问题描述

我在对数据进行**双因素方差分析(TwoWay ANOVA)**后,执行了TukeyHSD事后检验,得到如下输出。需要将结果的第一列(如0.1-0格式)拆分为Group1和Group2两列,生成包含Group1、Group2、P(即p adj列)的新数据框,作为ggplot中p_stat_manual的输入。目前手动构建分组列耗时且易出错,求高效实现方法。

TukeyHSD输出结果

diff        lwr       upr     p adj
0.1-0          -7.6925867  -79.28269  63.89752 0.9999650
1-0             9.6882972  -40.93355  60.31014 0.9984060
10-0            4.1546350  -46.46721  54.77648 0.9999945
100-0           7.4767801  -44.70303  59.65659 0.9997580
1000-0          7.9958523  -41.34422  57.33593 0.9994555
10000-0        11.6970426  -42.41999  65.81407 0.9965756
100000-0     -104.3276885 -158.44472 -50.21066 0.0000106
1-0.1          17.3808839  -54.20922  88.97099 0.9930363
10-0.1         11.8472217  -59.74288  83.43732 0.9993756
100-0.1        15.1693668  -57.53073  87.86946 0.9972505
1000-0.1       15.6884389  -55.00112  86.37800 0.9959677
10000-0.1      19.3896293  -54.71317  93.49243 0.9891406
100000-0.1    -96.6351019 -170.73790 -22.53230 0.0038992
10-1           -5.5336622  -56.15551  45.08819 0.9999607
100-1          -2.2115171  -54.39132  49.96829 0.9999999
1000-1         -1.6924450  -51.03252  47.64763 1.0000000
10000-1         2.0087454  -52.10829  56.12578 1.0000000
100000-1     -114.0159857 -168.13302 -59.89895 0.0000019
100-10          3.3221451  -48.85766  55.50195 0.9999990
1000-10         3.8412172  -45.49886  53.18129 0.9999962
10000-10        7.5424076  -46.57462  61.65944 0.9997987
100000-10    -108.4823236 -162.59935 -54.36529 0.0000051
1000-100        0.5190721  -50.41818  51.45632 1.0000000
10000-100       4.2202625  -51.35684  59.79736 0.9999968
100000-100   -111.8044686 -167.38157 -56.22737 0.0000047
10000-1000      3.7011904  -49.21879  56.62117 0.9999982
100000-1000  -112.3235408 -165.24352 -59.40356 0.0000016
100000-10000 -116.0247312 -173.42451 -58.62495 0.0000043

当前手动实现的代码示例

group1 <- (c(1, 10, 100, 1000, 10000, 100000, "DMSO", 10, 100, 1000, 10000, 100000, "DMSO", 100, 1000, 10000, 100000, "DMSO", 1000, 10000, 100000, "DMSO", 10000, 100000, "DMSO", 100000, "DMSO", "DMSO"))
 
group2 <- factor(c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, 100, 100, 100, 100, 1000, 1000,1000, 10000, 10000, 100000))
高效解决方案

方法1:使用tidyverse工具链(推荐)

用broom将TukeyHSD结果转换为规整的数据框,再通过tidyr::separate一键拆分分组列,代码简洁易读:

# 加载依赖包
library(broom)
library(tidyr)
library(dplyr)

# 假设你的TukeyHSD结果对象名为tukey_result
tukey_df <- tidy(tukey_result)

# 拆分分组列,提取需要的字段
final_df <- tukey_df %>%
  separate(comparison, into = c("Group1", "Group2"), sep = "-") %>%
  select(Group1, Group2, P = p.adjust)

# 查看生成的数据框
head(final_df)

方法2:基础R实现(无需额外包)

如果不想加载第三方包,用基础R的字符串处理函数也能完成:

# 假设tukey_result是你的TukeyHSD结果对象
# 双因素ANOVA的TukeyHSD结果是列表,取第一个元素转为数据框
tukey_matrix <- as.data.frame(tukey_result[[1]])

# 拆分行名得到分组信息
group_pairs <- strsplit(rownames(tukey_matrix), "-")
Group1 <- sapply(group_pairs, "[", 1)
Group2 <- sapply(group_pairs, "[", 2)

# 组合成目标数据框
final_df <- data.frame(
  Group1 = Group1,
  Group2 = Group2,
  P = tukey_matrix$`p adj`,
  stringsAsFactors = FALSE
)

# 查看结果
head(final_df)

注意事项

  • 两种方法都能自动处理所有分组对,彻底避免手动输入的错误
  • 输出的final_df可以直接作为ggplot中p_stat_manual的输入
  • 若分组名称包含特殊字符(如示例中的"DMSO"),只要分组对用-分隔,方法依然有效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:15:37