【问题标题】:Can I joint 2 dataframes in R by an ID column and a nearest date value我可以通过 ID 列和最近的日期值在 R 中连接 2 个数据帧吗
【发布时间】:2023-02-06 17:52:24
【问题描述】:

我正在尝试将 2 个数据框中的常见 ID 值连接到它们在 R 中最匹配的日期。我有一个包含人口统计数据的列表,另一个包含已收集的血液样本。不幸的是,两次访问的日期并不完全一致。因此,我想按日期为每个 ID 配对最接近出现的条目。

下面的代码代表了我想做的事情。我想通过公共 ID 值和每个条目最匹配的日期合并 df1 和 df2 中的所有列。例如,在这种情况下,ID 号 1 将有 2 个条目。

library(lubridate)


df1 <- data.frame(ID = c(1, 1, 3, 3, 5),
              var2 = c("Dog", "Dog", "Cat", "Cat", "Hamster"),
                  Date = c("01-01-2022","02-01-2022" , "07-12-2022", "03-02-2023", "05-12-2022"))
df1$Date <- dmy(df1$Date)


df2 <- data.frame(ID = c(1, 1, 3, 3, 5),
              Date = c("07-01-2022","04-12-2022" , "10-12-2022", "04-02-2023", "15-12-2022"))

df2$Date <- dmy(df2$Date)

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    您可以合并,然后计算 difference 并保持最接近:

    library(dplyr)
    df1 %>% 
      inner_join(df2, by = "ID", multiple = "all") %>% 
      mutate(diff = abs(Date.x - Date.y)) %>% 
      slice_min(diff, n = 1, by = c(ID, Date.x)) %>% 
      select(-diff)
    
      ID    var2     Date.x     Date.y
    1  1     Dog 2022-01-01 2022-01-07
    2  1     Dog 2022-01-02 2022-01-07
    3  3     Cat 2022-12-07 2022-12-10
    4  3     Cat 2023-02-03 2023-02-04
    5  5 Hamster 2022-12-05 2022-12-15
    

    请注意,自closest does not accept == 以来,join_by 在这里无能为力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2021-11-03
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多