如何最好地使用 R 将数据框从长到宽并组合值

How best to use R to reshape dataframe from long to wide and combine values

我有一个大约 2000 行和 3 列的数据框。本质上,我想将这个数据框重塑为更宽而不是更长。这是我当前数据的示例:

ID Procedure Date
D55 Sedation 01/01/2001
D55 Excision 01/01/2001
D55 Biopsy 01/01/2001
A66 Sedation 02/02/2001
A66 Excision 02/02/2001
T44 Sedation 03/03/2001
T44 Biopsy 03/03/2001
T44 Sedation 04/04/2001
T44 Excision 04/04/2001
G88 Sedation 05/05/2001
G88 Biopsy 05/05/2001
G88 Sedation 06/06/2001
G88 Excision 06/06/2001
G88 Sedation 07/07/2001
G88 Re-excision 07/07/2001

我希望每一行都是 ID 的一行,所以我想创建这样的东西:

ID Date 1 Procedure(s) Date 2 Procedure(s) Date 3 Procedure(s)
D55 01/01/2001 Sedation, Excision, Biopsy
A66 02/02/2001 Sedation, Excision
T44 03/03/2001 Sedation, Biopsy 04/04/2001 Sedation, Excision
G88 05/05/2001 Sedation, Biopsy 06/06/2001 Sedation, Excision 07/07/2001 Sedation, Re-excision

大多数 ID 都具有相同的日期,但记录的程序不同。有少数人会在随后的日期接受进一步的程序。我看不到超过 3 个不同日期的任何日期,但是计算每个 ID 记录的日期的方法会很有用。

到目前为止,我已经尝试过使用 cast 和 dcast,但我并没有真正取得任何进展。我是 R 的新手,所以非常感谢任何帮助!感谢阅读。

library(tidyverse)
df %>%
  group_by(ID, Date) %>%
  summarize(Procedure = paste0(Procedure, collapse = ", ")) %>%
  mutate(col = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = col, values_from = c(Date, Procedure))

这目前需要在之后进行一些重新排序,这可以像在这个答案中那样完成:

# A tibble: 4 x 7
  ID    Date_1 Date_2 Date_3 Procedure_1                Procedure_2        Procedure_3          
  <chr> <chr>  <chr>  <chr>  <chr>                      <chr>              <chr>                
1 A66   2/2/01 NA     NA     Sedation, Excision         NA                 NA                   
2 D55   1/1/01 NA     NA     Sedation, Excision, Biopsy NA                 NA                   
3 G88   5/5/01 6/6/01 7/7/01 Sedation, Biopsy           Sedation, Excision Sedation, Re-excision
4 T44   3/3/01 4/4/01 NA     Sedation, Biopsy           Sedation, Excision NA