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

求助:在R中高效合并多对列以计算最大值并做配对t检验

解决R语言多组成对列的长格式重塑问题

问题分析

你需要将成对的测试列(如a1/a2、b1/b2)转换为长格式,避免多次使用pivot_longer导致的数据重复,同时高效处理大量测试列。原方法多次调用pivot_longer会产生笛卡尔积,导致数据冗余。

解决方案

使用一次pivot_longer拆分所有测试列的名称,再通过pivot_wide恢复测试类型列,最终得到目标结构:

代码实现

首先加载所需包:

library(tidyr)
library(dplyr)

处理数据:

# 原始数据
df <- data.frame(id = c("u1", "u1", "u2", "u2"),
                 visit = c("v1", "v2", "v1", "v2"),
                 a1 = c(1, 3, 5, 7),
                 b1 = c(11, 31, 51, 71),
                 a2 = c(2, 4, 6, 8),
                 b2 = c(21, 41, 61, 81))

# 重塑为目标长格式
df_long <- df %>%
  pivot_longer(
    cols = -c(id, visit),  # 保留id和visit列,处理其余所有测试列
    names_to = c("test", "group"),  # 将列名拆分为测试类型(a/b)和组(1/2)
    names_pattern = "(\\w)(\\d)",  # 匹配"字母+数字"的列名格式
    values_to = "value"
  ) %>%
  pivot_wider(
    names_from = test,  # 将测试类型转为列名(a、b)
    values_from = value
  ) %>%
  select(-group)  # 可选:移除组列,不影响后续分析

输出结果

执行后得到的df_long结构与你期望的一致:

# # A tibble: 8 × 4
#   id    visit     a     b
#   <chr> <chr> <dbl> <dbl>
# 1 u1    v1        1    11
# 2 u1    v1        2    21
# 3 u1    v2        3    31
# 4 u1    v2        4    41
# 5 u2    v1        5    51
# 6 u2    v1        6    61
# 7 u2    v2        7    71
# 8 u2    v2        8    81

后续分析

计算每个id-visit的最大值

df_max <- df_long %>%
  group_by(id, visit) %>%
  summarise(
    max_a = max(a),
    max_b = max(b),
    .groups = "drop"
  )

配对t检验

以比较不同访视的max_a为例:

t.test(max_a ~ visit, data = df_max, paired = TRUE)

扩展说明

如果你的测试列名格式不同(如test_a1、test_a2),只需调整names_pattern参数,例如:

names_pattern = "test_(\\w)(\\d)"

该方法无需修改代码即可处理任意多组成对测试列,高效且避免数据重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:35:02