在 R 中转置具有重复/不完整观察的数据集

问题描述 投票:0回答:1

我有以下数据集:

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,但这有点超出了我的处理能力。 谢谢你。

r data-manipulation transpose
1个回答
1
投票

可能有一种更优雅的方法可以在

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)
© www.soinside.com 2019 - 2024. All rights reserved.