【问题标题】:R: Collapse partial duplicate rows into one row by ID but with different conditions per columnR:按 ID 将部分重复的行折叠成一行,但每列的条件不同
【发布时间】:2021-08-14 14:14:38
【问题描述】:

我正在尝试合并或折叠基于 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,2,3,3,4,4,5,5), Var1 = c("A", "B", "B", NA, "A", NA, NA, NA, "A", "B"), Date1 = c("2021-05-01", "2021-06-01", "2021-03-01", NA, NA, "2021-02-01", "2021-04-01", "2021-03-01", "2021-02-01", "2021-02-01"), Var2 = c("X", "Y", "X", "X", "Y", NA, "X", "Z", "X", "Y"), Date2 = c("2021-05-01", "2021-04-01", NA, "2021-03-01", "2021-04-01","2021-05-01", NA, NA, "2021-03-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 中的相应值获取到新数据框中的单行中。尝试了各种方法,但我认为我完全没有走在正确的轨道上,所以任何帮助都将不胜感激!

【问题讨论】:

    标签: r merge duplicates match collapse


    【解决方案1】:

    这可能会有所帮助。您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2013-12-07
      相关资源
      最近更新 更多