gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:11:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com