如何最好地使用 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
我有一个大约 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