基于间隔范围内的公共ID和日期合并两个数据集

问题描述 投票:0回答:1

我有两个数据集:DF1-数据框,其中列出了国家/地区的负责人(leader_id)(country_code)和他们在办公室的时间间隔(office_interval)。 DF2-数据框,其中每个观察值都是一个事件,该事件具有ID(event_ID)国家/地区(country_code)及其发生的日期(event_date)

数据:

library(lubridate)

#Leader DF
leader_id <- c("Adam","Bob","Charlie","Derek", "Edgar")
country_code <- c(1,1,2,2,3)
office_interval <- c(interval(ymd("1900-01-01"), ymd("1905-01-01")), 
                     interval(ymd("1910-01-01"), ymd("1915-01-01")),
                     interval(ymd("1920-01-01"), ymd("1925-01-01")),
                     interval(ymd("1930-01-01"), ymd("1935-01-01")),
                     interval(ymd("1940-01-01"), ymd("1945-01-01")))
DF1 <- data.frame(leader_id, country_code, office_interval)

#Event DF
event_id <- c(1,1,2,3,3)
country_code <- c(1,2,2,1,3)
event_date <- c(as.Date("1901-01-02"), 
                as.Date("1920-01-02"), 
                as.Date("1921-01-02"),
                as.Date("1911-01-02"),
                as.Date("1941-02-02"))
DF2 <- data.frame(event_id, country_code, event_date)

我想在DF2中创建一个新列,该列基于DF2中在同一国家的leader office_interval内出现的每一行从DF1中获取领导者。

DF2之后应该看起来像这样:

  event_id country_code event_date leader_id
1        1            1 1901-01-02      Adam
2        1            2 1920-01-02   Charlie
3        2            2 1921-01-02   Charlie
4        3            1 1911-01-02       Bob
5        3            3 1941-02-02     Edgar

我已经尝试过here的一些解决方案,但是我无法让它们中的任何一个起作用。

r date join merge intervals
1个回答
0
投票

我们可以在此处尝试使用sqldf程序包,该程序包公开了使用SQL连接解决您的问题的接口。

library(sqldf)

sql <- "SELECT e.event_id, e.country_code, e.event_date, l.leader_id
        FROM DF2 e
        LEFT JOIN DF1 l
            ON e.event_date BETWEEN as.Date(int_start(l.office_interval)) AND
                                    as.Date(int_end(l.office_interval))"
DF2 <- sqldf(sql)
© www.soinside.com 2019 - 2024. All rights reserved.