【问题标题】:Left join two dataframes based on nearest timestamp in R [duplicate]根据R中最近的时间戳左连接两个数据帧[重复]
【发布时间】:2020-12-15 06:50:09
【问题描述】:

我正在尝试根据最近的时间戳对两个数据帧执行左连接。示例数据如下所示:

> df1
       ID      date1
1      1     2020-07-11 19:14:23
2      1     2020-07-21 13:11:10
3      1     2020-07-21 18:07:25
4      1     2020-07-28 18:18:11
5      2     2020-07-13 16:47:26
6      2     2020-07-18 17:11:37
7      3     2020-07-23 10:39:19

> df2
       ID      date2                 Flag
1      1     2020-07-11 18:14:23     Yes
2      1     2020-07-20 14:21:11     Yes
3      2     2020-07-13 17:18:13     Yes
4      2     2020-07-18 15:12:06     Yes

我想按 ID 和日期列合并两个数据框,以便可以将 df1 中的 Flag 列连接到最近的日期。结果是这样的

> Combined
       ID      date1                 Flag
1      1     2020-07-11 19:14:23     Yes
2      1     2020-07-21 13:11:10     Yes
3      1     2020-07-21 18:07:25     
4      1     2020-07-28 18:18:11    
5      2     2020-07-13 16:47:26     Yes
6      2     2020-07-18 17:11:37     Yes
7      3     2020-07-23 10:39:19

找不到合适的解决方案。请帮忙。

【问题讨论】:

标签: r join dplyr data.table left-join


【解决方案1】:

这样的事情可能会奏效。

library(data.table)
setDT(df2)[, join_date := date2]
setDT(df1)[, join_date := date1]

# rolling join
df<-df1[df2, on = .(ID, join_date), roll = "nearest"]

【讨论】:

  • 得到这个错误``` bmerge中的错误(i,x,leftcols,rightcols,roll,rollends,nomatch,mult,:roll ='nearest'不能应用于字符列, ```
  • 您需要将列转换为适当的类
  • 我已将它们转换为适当的类。 'ID' 和 'Flag' 列是字符列,date1 和 date 2 仅是日期格式
  • Data.table 在最后一个键列上滚动。在答案中它被设置为 ID,当它需要是 join_date 时。所以最后一行应该是df&lt;-df1[df2, on = .(ID, join_date), roll = "nearest"]
  • 谢谢@BrianFisher。我对帖子进行了此编辑。
【解决方案2】:

这里是使用dplyr的迂回方式

library(dplyr)
df1 %>% 
  left_join(df2 %>%
    left_join(df1) %>%
    mutate(date_diff = abs(date2 - date1)) %>%
    group_by(ID, date2) %>%
    filter(date_diff == min(date_diff)) %>%
    ungroup() %>%
    select(-date2, -date_diff) ) %>% 
  mutate(Flag = case_when(is.na(Flag) ~ "No",
                          TRUE ~ Flag))
Joining, by = "ID"
Joining, by = c("ID", "date1")
# A tibble: 7 x 3
     ID date1               Flag 
  <dbl> <dttm>              <chr>
1     1 2020-07-11 19:14:23 Yes  
2     1 2020-07-21 13:11:10 Yes  
3     1 2020-07-21 18:07:25 No   
4     1 2020-07-28 18:18:11 No   
5     2 2020-07-13 16:47:26 Yes  
6     2 2020-07-18 17:11:37 Yes  
7     3 2020-07-23 10:39:19 No 

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2020-09-23
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多