如何将长格式试验数据透视并提取基线得分作为独立列
问题描述
我有一份长格式的试验数据,每位参与者会被多次评估多个得分,示例数据生成代码如下:
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)
代码说明
- 提取基线数据:筛选
time=0的行,移除time列,用rename_with批量将所有score_开头的列重命名为得分_0格式,自动适配所有得分列,无需手动指定。 - 合并数据:筛选非基线的随访数据,通过
left_join按patient和group精准匹配基线数据,最后调整列顺序匹配需求结构。 - 扩展性:实际数据集有7个得分时,只需保证得分列均以
score_开头,代码无需修改即可自动生成对应的score_x_0列;6次随访的情况也会自动保留所有time≠0的行。
内容的提问来源于stack exchange,提问作者jackahall
相关产品推荐
相关产品推荐

