展平 Dataframe ,旋转以获得每个患者ID的一行和每个访视日期的重复列集

qhhrdooz  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(163)

在R studio中,是否有可能以这样一种方式透视合并的 Dataframe ,即每次测量都会得到一组重复的列?
我有两个数据框,一个是患者和访视时刻代码,另一个是患者、访视日期和测量值。问题是我事先不知道每个病人的最大访问量是多少,所以我事先不知道最大需要列是多少。可能一个患者有3次就诊,而另一个患者只有1次。
此外,访问的 Dataframe 确实有一个度量代码列(1,2,3等),因此理想情况下,应该使用该列作为列名后缀对列集进行分组,因此在示例中,如Chol_1Chol_2Chol_3或类似的东西。
所以我有下面的示例代码

library(dplyr)
library(tidyr)

df_visits <- read.table(text = "
PATID,Moment,VisitDate
1001,1,2020-09-04
1001,2,2021-11-04
2002,1,2020-03-14
3003,1,2020-09-24
3003,2,2020-09-27
3003,3,2020-10-11
", header = TRUE, sep = ",") #  

df_measure <- read.table(text = "
PATID,VisitDate,Chol,Kreat,HbA1c
1001,2021-11-04,3.70,82,6.7
1001,2020-09-04,4.60,63,7.9
2002,2020-03-14,2.60,53,6.0
3003,2020-10-11,3.90,94,7.5
3003,2020-09-27,4.90,137,6.7
3003,2020-09-24,4.90,127,7.5
", header = TRUE, sep = ",") #  

# Merge the dataframes based on patient_id and visit_date
merged_df <- merge(df_visits, df_measure, by = c("PATID", "VisitDate"))

然后我尝试使用tidyr::pivot_wider(),请参阅下面的代码。

pivoted_df <- merged_df %>%
pivot_wider(names_from = c("Chol", "Kreat", "HbA1c"),
            values_from = c("Chol", "Kreat", "HbA1c"),
            names_sep = "_")

但这不起作用,它没有“扁平化”为PATIDVisitDate,它似乎是根据实际值生成列名。我想也许可以使用pivot_wider_spec,但我不知道正确的参数来获得所需的结果,或者是否可能。所需的输出dataframe是这样的:

| 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 |           | 2020-09-04    | 2021-11-04   |              |    4.60 |       63 |      7.9 |    3.70 |       82 |      6.7 |         |          |          |
|  2002 |         1 |           |           | 2020-03-14    |              |              |    2.60 |       53 |      6.0 |         |          |          |         |          |          |
|  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 |

有人能给我指个方向吗?

4sup72z8

4sup72z81#

您是否正在寻找:

library(tidyverse)
merged_df %>%
  pivot_wider(names_from = 'Moment',
              values_from = c('Moment', 'VisitDate', 'Chol', 'Kreat', 'HbA1c'))

# A tibble: 3 x 16
  PATID Moment_1 Moment_2 Moment_3 VisitDate_1 VisitDate_2 VisitDate_3 Chol_1
  <int>    <int>    <int>    <int> <chr>       <chr>       <chr>        <dbl>
1  1001        1        2       NA 2020-09-04  2021-11-04  <NA>           4.6
2  2002        1       NA       NA 2020-03-14  <NA>        <NA>           2.6
3  3003        1        2        3 2020-09-24  2020-09-27  2020-10-11     4.9
# ... with 8 more variables: Chol_2 <dbl>, Chol_3 <dbl>, Kreat_1 <int>,
#   Kreat_2 <int>, Kreat_3 <int>, HbA1c_1 <dbl>, HbA1c_2 <dbl>, HbA1c_3 <dbl>

相关问题