在RStudio中如何按就诊序号透视合并DataFrame,实现一行一患者?
在RStudio中实现合并DataFrame的透视:按就诊序号生成重复指标列
需求说明
现有合并后的患者数据(包含就诊序号Moment、就诊日期VisitDate及各类测量指标),需要转换为每行对应单个患者的宽格式:
- 每个原始指标(如
Chol、VisitDate)按就诊序号生成重复列(例:Chol_01、VisitDate_02) - 无需预先知晓患者的最大就诊次数
错误尝试问题
之前使用tidyr::pivot_wider时,错误地将测量值作为列名来源,导致生成的列名不符合预期。
正确实现代码
基于合并后的merged_df,使用pivot_wider并指定正确参数即可实现需求:
library(dplyr) library(tidyr) # 合并数据(已提供) merged_df <- merge(df_visits, df_measure, by = c("PATID", "VisitDate")) # 生成目标宽格式数据 pivoted_df <- merged_df %>% pivot_wider( id_cols = PATID, names_from = Moment, values_from = c(Moment, VisitDate, Chol, Kreat, HbA1c), names_glue = "{.value}_{sprintf('%02d', Moment)}" )
参数解释
id_cols = PATID:指定以患者ID为分组依据,确保每行对应一位患者names_from = Moment:用就诊序号作为同一指标不同记录的区分标识values_from:列出所有需要转换为宽格式的字段(包含就诊信息和测量指标)names_glue:自定义列名格式,{.value}指代原始变量名,sprintf('%02d', Moment)将序号补为两位数字(如1→01),完全匹配期望的列名样式
结果验证
运行后得到的pivoted_df与期望输出一致(R中空值显示为NA,可按需用replace_na()替换为空白):
| PATID | Moment_01 | Moment_02 | Moment_03 | VisitDate_01 | VisitDate_02 | VisitDate_03 | Chol_01 | Kreat_01 | HbA1c_01 | Chol_02 | Kreat_02 | HbA1c_02 | Chol_03 | Kreat_03 | HbA1c_03 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1001 | 1 | 2 | NA | 2020-09-04 | 2021-11-04 | NA | 4.60 | 63 | 7.9 | 3.70 | 82 | 6.7 | NA | NA | NA |
| 2002 | 1 | NA | NA | 2020-03-14 | NA | NA | 2.60 | 53 | 6.0 | NA | NA | NA | NA | NA | NA |
| 3003 | 1 | 2 | 3 | 2020-09-24 | 2020-09-27 | 2020-10-11 | 4.90 | 127 | 7.5 | 4.90 | 137 | 6.7 | 3.90 | 94 | 7.5 |
内容的提问来源于stack exchange,提问作者BdR
相关产品推荐
相关产品推荐

