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

如何将长格式试验数据透视并提取基线得分作为独立列

问题描述

我有一份长格式的试验数据,每位参与者会被多次评估多个得分,示例数据生成代码如下:

set.seed(1)
data <- data.frame(patient = rep(c(100, 101, 102, 103), 3),
                   group = rep(c("A", "B", "A", "B"), 3),
                   time = rep(c(0, 1, 2), each = 4),
                   score_a = runif(12),
                   score_b = runif(12))
print(data, digits = 2)

生成的示例数据:

patient group time score_a score_b
1      100     A    0   0.266    0.69
2      101     B    0   0.372    0.38
3      102     A    0   0.573    0.77
4      103     B    0   0.908    0.50
5      100     A    1   0.202    0.72
6      101     B    1   0.898    0.99
7      102     A    1   0.945    0.38
8      103     B    1   0.661    0.78
9      100     A    2   0.629    0.93
10     101     B    2   0.062    0.21
11     102     A    2   0.206    0.65
12     103     B    2   0.177    0.13

我需要在保留长格式的前提下,将基线(time = 0)的测量值提取为独立列,新列结构为:

patient group score_a_0 score_b_0 time score_a score_b

处理后示例数据集应有8行(4位患者的time=1和time=2数据),方便后续在每个时间点调整基线。实际数据集包含7个得分和6次随访,需要通用解决方案,我尝试结合pivot_wider和pivot_longer但未成功,理想输出如下:

patient group time    score_a   score_b score_a_0 score_b_0
1     100     A    1 0.20168193 0.7176185 0.2655087 0.6870228
2     101     B    1 0.89838969 0.9919061 0.3721239 0.3841037
3     102     A    1 0.94467527 0.3800352 0.5728534 0.7698414
4     103     B    1 0.66079779 0.7774452 0.9082078 0.4976992
5     100     A    2 0.62911404 0.9347052 0.2655087 0.6870228
6     101     B    2 0.06178627 0.2121425 0.3721239 0.3841037
7     102     A    2 0.20597457 0.6516738 0.5728534 0.7698414
8     103     B    2 0.17655675 0.1255551 0.9082078 0.4976992
通用解决方案(基于tidyverse)

无需反复转置,通过分离基线数据再合并的方式即可实现,适配任意数量的得分列和随访时间点:

library(tidyverse)

# 提取基线数据并批量重命名得分列
baseline_data <- data %>%
  filter(time == 0) %>%
  select(-time) %>%
  rename_with(~paste0(., "_0"), starts_with("score_"))

# 筛选随访数据并合并基线数据,调整列顺序
final_data <- data %>%
  filter(time != 0) %>%
  left_join(baseline_data, by = c("patient", "group")) %>%
  select(patient, group, score_a_0, score_b_0, time, score_a, score_b)

# 查看结果
print(final_data, digits = 8)

代码说明

  1. 提取基线数据:筛选time=0的行,移除time列,用rename_with批量将所有score_开头的列重命名为得分_0格式,自动适配所有得分列,无需手动指定。
  2. 合并数据:筛选非基线的随访数据,通过left_join按patient和group精准匹配基线数据,最后调整列顺序匹配需求结构。
  3. 扩展性:实际数据集有7个得分时,只需保证得分列均以score_开头,代码无需修改即可自动生成对应的score_x_0列;6次随访的情况也会自动保留所有time≠0的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:01:06