在R studio中,是否有可能以这样一种方式透视合并的 Dataframe ,即每次测量都会得到一组重复的列?
我有两个数据框,一个是患者和访视时刻代码,另一个是患者、访视日期和测量值。问题是我事先不知道每个病人的最大访问量是多少,所以我事先不知道最大需要列是多少。可能一个患者有3次就诊,而另一个患者只有1次。
此外,访问的 Dataframe 确实有一个度量代码列(1,2,3等),因此理想情况下,应该使用该列作为列名后缀对列集进行分组,因此在示例中,如Chol_1
,Chol_2
,Chol_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 = "_")
但这不起作用,它没有“扁平化”为PATID
和VisitDate
,它似乎是根据实际值生成列名。我想也许可以使用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 |
有人能给我指个方向吗?
1条答案
按热度按时间4sup72z81#
您是否正在寻找: