R:按 ID 将部分重复行折叠为一行,但每列的条件不同

问题描述

我正在尝试合并或折叠基于 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 VarDate

目前尚不清楚第 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