我有我想与我只有开始日期的事件匹配的日期。作为一个简化的代表,假设我想弄清楚在某些事件中谁是总统,但我只有就职日期。
pres <- data.frame(pres = c("Ronald Reagan", "George H. W. Bush",
"Bill Clinton", "George W. Bush", "Barack
Obama", "Donald Trump"),
inaugdate = structure(c(4037, 6959, 8420, 11342, 14264,
17186), class = "Date"))
events <- data.frame(event = c("Challenger explosion", "Chernobyl
explosion", "Hurricane Katrina", "9-11"),
date = structure(c(5871, 5959, 13024, 11576), class = "Date"))
显然,一个简单的 left_join 是行不通的,因为这些事件没有发生在就职日。
events %>%
left_join(pres, by = c("date" = "inaugdate"))
在 Excel 中,vlookup 用于为您提供 true(匹配最接近的前一个)或 false(完全匹配)选项。 tidyverse 中有类似的东西吗?
最佳答案
这是实现预期结果的一种方法,尽管它可能会稍微美化一下。您可以创建区间,这是lubridate
提供的一个类。指定具有特定开始和结束时间的时间跨度。这是 %within%
附带的运算符以查看日期是否在该间隔内。所以我们可以先创建这个区间并使pres
column 一个字符类型,以便我们可以正确索引它。然后,我们用 map_chr
迭代事件日期。 ,使用一个函数说“检查这个日期是否在每个间隔中,获取它实际所在的那个的索引(使用 which
),并返回对应的总统”。显然,这要求每个日期只能在一个时间间隔内找到,否则这将失败。
library(tidyverse)
library(lubridate)
pres <- data.frame(pres = c("Ronald Reagan", "George H. W. Bush",
"Bill Clinton", "George W. Bush",
"Barack Obama", "Donald Trump"),
inaugdate = structure(c(4037, 6959, 8420, 11342, 14264,
17186), class = "Date"))
events <- data.frame(event = c("Challenger explosion", "Chernobyl explosion",
"Hurricane Katrina", "9-11"),
date = structure(c(5871, 5959, 13024, 11576), class = "Date"))
pres2 <- pres %>%
mutate(
presidency = interval(inaugdate, lead(inaugdate, default = today())),
pres = as.character(pres)
)
events %>%
mutate(pres = map_chr(date, ~ pres2$pres[which(. %within% pres2$presidency)]))
#> event date pres
#> 1 Challenger explosion 1986-01-28 Ronald Reagan
#> 2 Chernobyl explosion 1986-04-26 Ronald Reagan
#> 3 Hurricane Katrina 2005-08-29 George W. Bush
#> 4 9-11 2001-09-11 George W. Bush
创建于 2019-02-04 由 reprex package (v0.2.1)
关于r - tidyverse:将特定日期与事件期间匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54522162/