如果某个日期属于开始日期和结束日期,则编写虚拟变量

时间:2018-03-08 18:30:17

标签: r date

我有一个DF1,它包含一系列带有开始日期(开始日期)和结束日期(结束日期)的观察结果:它们都是y / m / d格式。我想检查来自另一个数据集(DF2,也有一个日期变量)的观察是否在DF1$startdateDF1$endate.

的区间内

在实践中,我希望得到: 如果每个DF2$dateDF1$startdate的时间间隔中包含每个DF1$endate

不幸的是,我不能手动完成,因为观察次数需要很长时间。

我试过这个,但它似乎不起作用:

for (i in 1:length(DF2$date))
{ 
for (j in 1:length(DF1$startdate)){
if (DF1$startdate[j] <= DF2$date[i] 
  <= DF1$enddate[j]){
  DF2 = append(frcab_content_lemma_ngram_postprocessed$HasMid, 1)
   } 
  else {DF2$HasMid = append(DF2$HasMid, 0}
   }
  }

谢谢!

1 个答案:

答案 0 :(得分:1)

这是使用dplyr的理想场所。我在这里做的是left_join DF1和DF2,所以我们可以使用每个变量,然后使用mutate()添加一个新变量'hasMid',其值根据{的结果设置{1}}陈述:

if_else

输出:

library(dplyr)
DF1 <- data.frame(x = c(1, 2, 3, 1, 1, 2),
                  startdate = c(10, 15, 12, 5, 6, 21),
                  enddate = c(11, 25, 18, 7, 19, 30))
DF2 <- data.frame(x = c(1,2,3), date = c(8, 21, 19))

x <- DF1 %>%
    left_join(DF2, by = c('x' = 'x')) %>%
    mutate(hasMid = if_else(startdate <= date & date <= enddate, TRUE, FALSE))

对于未来,如果你给人们一个简单的可重复的例子,那么回答这样的问题要容易得多: