首页 > 解决方案 > 根据区间范围内的公共 id 和日期合并两个数据集

问题描述

我有两个数据集: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 中同一国家的领导人 office_interval 中出现的每一行,从 DF1 中获取 leaderid。

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

我从这里尝试了一些解决方案,但我无法让它们中的任何一个工作。

标签: rdatejoinmergeintervals

解决方案


这是一个解决方案,也许可以满足您的目的

idx <- sapply(1:nrow(DF2), function(k) which(DF2$event_date[k] %within% DF1$office_interval & DF2$country_code[k]%in% DF1$country_code))
DF2$leader_id <- DF1$leader_id[idx]

这样

> 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

推荐阅读