Вот один из способов достижения желаемого результата, хотя, возможно, его можно немного приукрасить.Вы можете создать интервалы, которые являются классом, предоставленным lubridate
, чтобы указать промежутки времени с определенным временем начала и окончания.Это происходит с оператором %within%
, чтобы увидеть, находится ли дата в этом интервале.Таким образом, мы можем сначала создать этот интервал и сделать столбец pres
типом символа, чтобы мы могли правильно его проиндексировать.Затем мы перебираем даты событий с 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 пакетом prex (v0.2,1)