我有以下数据集:
Pt_ID vital_descr vital_value
1 HR 70
1 SBP 110
1 DBP 75
1 HR NA
1 SBP 105
1 DBP 60
2 SBP 150
2 DBP 90
3 HR 55
3 SBP 150
3 DBP 70
3 SBP 160
3 DBP 70
3 SBP 160
3 DBP 80
我想将其“转置”为:
Pt_ID HR_1 SBP_1 DBP_1 HR_2 SBP_2 DBP_2 HR_3 SBP_3 DBP_3
1 70 110 75 NA 105 60 NA NA NA
2 NA 150 90 NA NA NA NA NA NA
3 55 150 70 NA 160 70 NA 170 80
在原始数据集中,每个生命体征的值都在不同的行中报告;生命体征的类型由“vital_descr”列标识。对于每位患者,相同的生命体征可能被报告零次到多次。
我希望最终数据集的行数等于患者的数量,并且所有观察结果都转换为根据相应的“vital_descr”标签命名的列;重复观察结果应在单独的列中报告,并用适当的后缀标识,而不是汇总。
我尝试过使用 reshape2 和 dcast,但这有点超出了我的处理能力。 谢谢你。
可能有一种更优雅的方法可以在
pivot_wider
本身内完成此操作,但实用的方法可能是使用 dplyr::mutate
在 vital_descr
列中添加实例编号,然后 pivot_wider
:
library(tidyr)
library(dplyr)
df %>%
mutate(vital_descr = paste0(vital_descr, "_", row_number()),
.by = vital_descr) %>%
pivot_wider(names_from = vital_descr, values_from = vital_value)
输出:
# Pt_ID HR_1 SBP_1 DBP_1 HR_2 SBP_2 DBP_2 SBP_3 DBP_3 HR_3 SBP_4 DBP_4 SBP_5 DBP_5 SBP_6 DBP_6
# <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
# 1 1 70 110 75 NA 105 60 NA NA NA NA NA NA NA NA NA
# 2 2 NA NA NA NA NA NA 150 90 NA NA NA NA NA NA NA
# 3 3 NA NA NA NA NA NA NA NA 55 150 70 160 70 160 80
数据:
df <- read.table(text = "Pt_ID vital_descr vital_value
1 HR 70
1 SBP 110
1 DBP 75
1 HR NA
1 SBP 105
1 DBP 60
2 SBP 150
2 DBP 90
3 HR 55
3 SBP 150
3 DBP 70
3 SBP 160
3 DBP 70
3 SBP 160
3 DBP 80", h = TRUE)