首页 > 解决方案 > 根据间隔条件合并数据帧

问题描述

我有一个这样的数据框

id start        end
1  20/06/88     24/07/89
1  27/07/89     13/04/93
1  14/04/93     6/09/95
2  3/01/92      11/02/94
2  30/03/94     16/04/96
2  17/04/96     18/08/97

我想与这个其他数据框合并

id date
1  26/08/88   
2  10/05/96    

生成的合并数据框应如下所示

id start        end         date
1  20/06/88     24/07/89    26/06/88
1  27/07/89     13/04/93    NA
1  14/04/93     6/09/95     NA
2  3/01/92      11/02/94    NA
2  30/03/94     16/04/96    NA
2  17/04/96     18/08/97    10/05/96

在实践中,我想基于 id 合并两个数据帧,并且日期必须位于第一个数据帧的开始和结束变量所跨越的间隔内。

你对如何做到这一点有什么建议吗?我尝试使用fuzzyjoin 包,但我有一些内存问题..

非常感谢大家

标签: r

解决方案


可能是骗子,当我找到一个好的目标时会删除。同时,我们可以使用fuzzyjoin

library(tidyverse)
library(fuzzyjoin)
df1 %>%
    mutate_at(2:3, as.Date, "%d/%m/%y") %>%
    fuzzy_left_join(
        df2 %>% mutate(date = as.Date(date, "%d/%m/%y")),
        by = c("id" = "id", "start" = "date", "end" = "date"),
        match_fun = list(`==`, `<`, `>`))
#  id.x      start        end id.y       date
#1    1 1988-06-20 1989-07-24    1 1988-08-26
#2    1 1989-07-27 1993-04-13   NA       <NA>
#3    1 1993-04-14 1995-09-06   NA       <NA>
#4    2 1992-01-03 1994-02-11   NA       <NA>
#5    2 1994-03-30 1996-04-16   NA       <NA>
#6    2 1996-04-17 1997-08-18    2 1996-05-10

剩下的就是整理id列。


样本数据

df1 <- read.table(text = "
id start        end
1  20/06/88     24/07/89
1  27/07/89     13/04/93
1  14/04/93     6/09/95
2  3/01/92      11/02/94
2  30/03/94     16/04/96
2  17/04/96     18/08/97", header = T)

df2 <- read.table(text = "
id date
1  26/08/88
2  10/05/96   ", header = T)

推荐阅读