R 如何检查每个国家/地区的日期是否在跨行的特定间隔内?

R 如何检查每个国家/地区的日期是否在跨行的特定间隔内?,r,lubridate,R,Lubridate,在此基础上,我们希望查看某个特定事件是否符合另一个事件指定的时间范围。给你们一个具体的例子:对于每个国家,选举时是否发生了事件(战斗/抗议/…) country <- c("Angola","Angola","Angola","Angola","Angola", "Benin","Benin","Benin","Benin","Benin","Benin") event_type <- c("battle", "protests","riots", "riots", "electio

在此基础上,我们希望查看某个特定事件是否符合另一个事件指定的时间范围。给你们一个具体的例子:对于每个国家,选举时是否发生了事件(战斗/抗议/…)

country <- c("Angola","Angola","Angola","Angola","Angola", "Benin","Benin","Benin","Benin","Benin","Benin")
event_type <- c("battle", "protests","riots", "riots", "elections","elections","protests","riots","violence","riots","elections")
event_date <- as.Date(c("2017-06-16", "2017-01-23", "2016-03-15", "2017-09-18", "2017-08-23", "2019-04-18", "2019-03-12", "2019-04-14", "2018-03-15", "2015-09-14", "2016-03-20"))
start_ecycle <- as.Date(c(NA,NA,NA,NA,"2017-05-25", "2019-01-18",NA,NA,NA,NA,"2015-12-21"))
end_ecycle <-as.Date(c(NA,NA,NA,NA,"2017-09-22","2019-05-18",NA,NA,NA,NA,"2016-04-19"))

mydata <- data.frame(country, event_type, event_date, start_ecycle, end_ecycle)

country根据您对跨行选举周期的评论,我建议首先使用选举数据创建一个单独的数据集

然后可以加入“选举日期”表。这将为每个事件和选举日期范围创建一个重复行

然后,可以使用%within%lubridate函数检查事件是否在特定的选举日期范围内

最后,我通过过滤掉与选举日期范围不相关的行来减少行数

我更熟悉dplyr和purrr,并在下面使用它们来实现它。但是您也应该能够对base-r函数执行类似的操作

我得到的输出接近您所需的输出。但不是100%确定你为什么要这样做


图书馆(tidyverse)
图书馆(lubridate)
图书馆(purrr)
选举%
as_tible()%>%
选择(国家、事件类型、开始循环、结束循环)%>%
筛选器(事件类型==“选举”)%>%
突变(选举年=年(开始循环))%>%
选择(国家、开始周期、结束周期、选举年)
mydata2%
as_tible()%>%
变异(行=行编号())%>%
选择(行、国家、事件类型、事件日期)%>%
左派加入(选举,由=“国家”)%>%
突变(ecycle=map2(开始ecycle,结束ecycle,~interval(.x,.y)))%>%
突变(ecycle\U int=map2\U int(事件日期,ecycle,~.x%在%.y内))%>%
选择(-ecycle)%>%
分组依据(国家、事件类型、事件日期)%>%
排列(描述(内循环)%>%
切片(1:1)%>%
解组()%>%
排列(行)%>%
选择(-行)
mydata2%>%选择(-选举年)
#>#A tibble:11 x 6
#>国家/地区事件\类型事件\日期开始\周期结束\周期内
#>                                      
#>安哥拉之战2017-06-16 2017-05-25 2017-09-22 1
#>2安哥拉抗议2017-01-23 2017-05-25 2017-09-22 0
#>3安哥拉骚乱2016-03-15 2017-05-25 2017-09-22 0
#>4安哥拉骚乱2017-09-18 2017-05-25 2017-09-22 1
#>5安哥拉选举2017-08-23 2017-05-25 2017-09-22 1
#>6贝宁选举2019-04-18 2019-01-18 2019-05-18 1
#>7贝宁抗议2019-03-12 2019-01-18 2019-05-18 1
#>8.2019-04-14 2019-01-18 2019-05-18 1
#>9贝宁暴力2018-03-15 2019-01-18 2019-05-18 0
#>10贝宁骚乱2015-09-14 2019-01-18 2019-05-18 0
#>11贝宁选举2016-03-20 2015-12-21 2016-04-19 1

根据您对跨行选举周期的评论,我建议首先使用选举数据创建一个单独的数据集

然后可以加入“选举日期”表。这将为每个事件和选举日期范围创建一个重复行

然后,可以使用%within%lubridate函数检查事件是否在特定的选举日期范围内

最后,我通过过滤掉与选举日期范围不相关的行来减少行数

我更熟悉dplyr和purrr,并在下面使用它们来实现它。但是您也应该能够对base-r函数执行类似的操作

我得到的输出接近您所需的输出。但不是100%确定你为什么要这样做


图书馆(tidyverse)
图书馆(lubridate)
图书馆(purrr)
选举%
as_tible()%>%
选择(国家、事件类型、开始循环、结束循环)%>%
筛选器(事件类型==“选举”)%>%
突变(选举年=年(开始循环))%>%
选择(国家、开始周期、结束周期、选举年)
mydata2%
as_tible()%>%
变异(行=行编号())%>%
选择(行、国家、事件类型、事件日期)%>%
左派加入(选举,由=“国家”)%>%
突变(ecycle=map2(开始ecycle,结束ecycle,~interval(.x,.y)))%>%
突变(ecycle\U int=map2\U int(事件日期,ecycle,~.x%在%.y内))%>%
选择(-ecycle)%>%
分组依据(国家、事件类型、事件日期)%>%
排列(描述(内循环)%>%
切片(1:1)%>%
解组()%>%
排列(行)%>%
选择(-行)
mydata2%>%选择(-选举年)
#>#A tibble:11 x 6
#>国家/地区事件\类型事件\日期开始\周期结束\周期内
#>                                      
#>安哥拉之战2017-06-16 2017-05-25 2017-09-22 1
#>2安哥拉抗议2017-01-23 2017-05-25 2017-09-22 0
#>3安哥拉骚乱2016-03-15 2017-05-25 2017-09-22 0
#>4安哥拉骚乱2017-09-18 2017-05-25 2017-09-22 1
#>5安哥拉选举2017-08-23 2017-05-25 2017-09-22 1
#>6贝宁选举2019-04-18 2019-01-18 2019-05-18 1
#>7贝宁抗议2019-03-12 2019-01-18 2019-05-18 1
#>8.2019-04-14 2019-01-18 2019-05-18 1
#>9贝宁暴力2018-03-15 2019-01-18 2019-05-18 0
#>10贝宁骚乱2015-09-14 2019-01-18 2019-05-18 0
#>11贝宁选举2016-03-20 2015-12-21 2016-04-19 1

为什么安哥拉骚乱会出现在ecycle中?没有开始和结束日期,所以它怎么可能在?谢谢-这正是我们的问题。从ecycle列(只有event_type=elections的条目)中,我们想推断每个国家/地区事件日期是否属于此周期。这就是为什么安哥拉6月16日的新栏“ecycle_in”编码为1,但1月23日没有。请注意,对于某些国家,有不止一次选举,因此有不止一次可能的选举周期进行比较
library(lubridate)
is.instant(mydata$start_ecycle); is.instant(mydata$end_ecycle)
mydata$ecycle <- interval(mydata$start_ecycle, mydata$end_ecycle)