首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyverse:将特定日期与事件周期相匹配

tidyverse:将特定日期与事件周期相匹配
EN

Stack Overflow用户
提问于 2019-02-04 18:25:41
回答 2查看 120关注 0票数 4

我有日期,我想要匹配的事件,我只有开始日期。作为一个简化的解释,说我想知道在某些活动中谁是总统,但我只有就职日期。

代码语言:javascript
复制
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是行不通的,因为这些事件不是在就职典礼上发生的。

代码语言:javascript
复制
events %>%
      left_join(pres, by = c("date" = "inaugdate"))

在Excel中,vlookup用于为您提供true (匹配最近的前一个)或false (匹配精确)的选项。在潮间带里有类似的东西吗?

EN

回答 2

Stack Overflow用户

发布于 2019-02-04 20:06:16

可能不是最有效的,但是我们可以在sqldf中使用一个不等式联接

代码语言:javascript
复制
library(sqldf)

sqldf('select a.event, a.date, b.pres
      from events a 
      left join pres b
      on a.date >= b.inaugdate
      group by a.event 
      having min(a.date - b.inaugdate)
      order by date, event')

输出:

代码语言:javascript
复制
                 event       date           pres
1 Challenger explosion 1986-01-28  Ronald Reagan
2  Chernobyl explosion 1986-04-26  Ronald Reagan
3                 9-11 2001-09-11 George W. Bush
4    Hurricane Katrina 2005-08-29 George W. Bush
票数 1
EN

Stack Overflow用户

发布于 2019-02-04 21:13:04

可能没有效率(取决于行数和列数),而是另一种解决问题的方法。

代码语言:javascript
复制
library(dplyr) 

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")) %>% 
                  #lead date to get interval
                  mutate(enddt = lead(inaugdate, default = Sys.Date())-1)

events <- data.frame(event = c("Challenger explosion", "Chernobyl explosion", "Hurricane Katrina", "9-11"), 
                     date = structure(c(5871, 5959, 13024, 11576), class = "Date"))          
#get every combination of rows
newdf <- merge(pres,events,all = TRUE) %>% 
  filter(date >= inaugdate, date < enddt)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54522162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档