问题描述
我正在尝试合并或折叠基于 ID 和基于列的不同条件的部分重复行。我想在新数据框中为每个 ID 生成一行。
这就是我的数据的样子。
ID Var1 Date1 Var2 Date2
1 1 A 2021-05-01 X 2021-05-01
2 1 B 2021-06-01 Y 2021-04-01
3 2 B 2021-03-01 X <NA>
4 2 <NA> <NA> X 2021-03-01
5 3 A <NA> Y 2021-04-01
6 3 <NA> 2021-02-01 <NA> 2021-05-01
7 4 <NA> 2021-04-01 X <NA>
8 4 <NA> 2021-03-01 Z <NA>
9 5 A 2021-02-01 X 2021-03-01
10 5 B 2021-02-01 Y 2021-04-01
我想按 ID 分组并为每个日期变量取最早的日期。然后,我想提取基于Date1的Var1和基于Date 2的Var2的对应值。
ID Var1 Date1 Var2 Date2
1 1 A 2021-05-01 Y 2021-04-01
2 2 B 2021-03-01 X 2021-03-01
3 3 <NA> 2021-02-01 Y 2021-04-01
4 4 <NA> 2021-03-01 <NA> <NA>
5 5 A 2021-02-01 X 2021-03-01
6 5 B 2021-02-01 X 2021-03-01
这是示例数据。
df <- data.frame (ID = c(1,1,2,3,4,5,5),Var1 = c("A","B",NA,"A","B"),Date1 = c("2021-05-01","2021-06-01","2021-03-01","2021-02-01","2021-04-01","2021-02-01"),Var2 = c("X","Y","X","Z","Y"),Date2 = c("2021-05-01","2021-05-01","2021-04-01"))
并转换为日期变量。
df.test1$P_date <- as.Date(df.test1$P_date,format = "%Y-%m-%d")
df.test1$R_date <- as.Date(df.test1$R_date,format = "%Y-%m-%d")
对于 ID 5,如果日期匹配但 Var1 或 Var2 不匹配,我想保留两行,但如果这太难了,那没关系。
我尽可能使用
获取每个日期变量的最早日期df <- df %>% group_by(ID) %>% mutate(earliest_date1 = last(na.omit(Date1,order_by = Date1)
df <- df %>% group_by(ID) %>% mutate(earliest_date2 = last(na.omit(Date2,order_by = Date2)
但是我无法将 Var1 和 Var 2 中的相应值放入新数据框中的一行中。尝试了各种方法,但认为我根本没有走在正确的轨道上,因此我们将不胜感激!
解决方法
这可能有助于开始。您可以使用 pivot_longer
放入长格式。然后按 ID
和 1 或 2 分组,按 Date
排序并取 first
Var
和 Date
。
目前尚不清楚第 5 行的完整逻辑是什么。也许你可以进一步解释?
library(tidyverse)
df %>%
mutate(across(starts_with("Date"),as.Date)) %>%
pivot_longer(cols = -ID,names_to = c(".value","Num"),names_pattern = "(Var|Date)(\\d+)") %>%
group_by(ID,Num) %>%
arrange(Date) %>%
summarise(earliest_date = first(Date),Var = first(Var)) %>%
pivot_wider(id_cols = ID,names_from = Num,values_from = c(Var,earliest_date))
输出
ID Var_1 Var_2 earliest_date_1 earliest_date_2
<dbl> <chr> <chr> <date> <date>
1 1 A Y 2021-05-01 2021-04-01
2 2 B X 2021-03-01 2021-03-01
3 3 NA Y 2021-02-01 2021-04-01
4 4 NA X 2021-03-01 NA
5 5 A X 2021-02-01 2021-03-01