r - tidyverse:将特定日期与事件期间匹配

标签 r vlookup tidyverse

我有我想与我只有开始日期的事件匹配的日期。作为一个简化的代表,假设我想弄清楚在某些事件中谁是总统,但我只有就职日期。

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/

相关文章:

r - 在 ggplot2 中用不同的列标记 y 轴

r - 按行提取非缺失元素并堆叠

r - 如何根据行和列在R中查找值

excel - 即使第一个结果下方的行中有值,VLOOKUP 也返回 0

r - Purrr:哪个嵌套数据框遇到了错误?

excel - 如果 VLookUp 为 TRUE(如果该值出现在单独工作表的列表中),则从 Sheet1 中删除整行

r - R 中的匹配和返回列表

r - 在全局环境 R 中初始化函数参数

r - Grep 点与分号

r - 比较 R 中的两个线性模型