在R语言中将长格式数据转换为宽格式的方法求助
问题描述
原始数据格式:
| Person ID | Treatment code |
|---|---|
| A | 00001 |
| A | 00002 |
| A | 00003 |
| B | 00002 |
| B | 00012 |
| C | 00003 |
| C | 00015 |
需要将数据转换为每行对应一位患者,列数等于患者的最大治疗次数,缺失记录填充为missing,目标格式:
| Patient ID | Treatment 1 | Treatment 2 | Treatment 3 |
|---|---|---|---|
| A | 00001 | 00002 | 00003 |
| B | 00002 | 00012 | missing |
| C | 00003 | 00015 | missing |
用户尝试使用tidyr::pivot_wider未成功,寻求R语言解决方案。
解决方案
核心是先为每个患者的治疗记录生成序号,再通过pivot_wider转换,同时指定缺失值填充内容。
# 加载所需包 library(dplyr) library(tidyr) # 构造原始数据(如果已有数据可跳过此步) df <- tibble( `Person ID` = c("A", "A", "A", "B", "B", "C", "C"), `Treatment code` = c("00001", "00002", "00003", "00002", "00012", "00003", "00015") ) # 数据转换流程 result_df <- df %>% # 按患者分组,生成治疗序号列 group_by(`Person ID`) %>% mutate(treatment_col = paste0("Treatment ", row_number())) %>% ungroup() %>% # 转换为宽表,填充缺失值为"missing" pivot_wider( id_cols = `Person ID`, names_from = treatment_col, values_from = `Treatment code`, values_fill = "missing" ) %>% # 重命名列匹配目标格式 rename(`Patient ID` = `Person ID`) # 输出结果 print(result_df)
执行上述代码后,即可得到符合要求的宽表数据。
内容的提问来源于stack exchange,提问作者Robisch
相关产品推荐
相关产品推荐

