【问题标题】:Comparing overlap within sequences of dates within a data frame比较数据框中日期序列内的重叠
【发布时间】:2015-07-21 07:15:09
【问题描述】:

我有一个包含 2 列开始日期和 2 列结束日期的数据框。我想计算两组系列之间重叠日期的数量(即 start2/end2 系列中有多少天属于 start1/end1 (如此处的“输出”列所示))。

      start1       end1     start2       end2 output
 2011-02-10 2011-02-11 2011-02-10 2011-02-10      1
 2009-07-25 2009-07-27 2009-07-26 2009-07-27      2
 2007-12-02 2007-12-07 2007-12-08 2007-12-10      0

start1 <- as.Date(c("2011-02-10", "2009-07-25", "2007-12-02"))
end1 <- as.Date(c("2011-02-11", "2009-07-27", "2007-12-07")) 
start2 <- as.Date(c("2011-02-10", "2009-07-26", "2007-12-08"))
end2 <- as.Date(c("2011-02-10", "2009-07-27", "2007-12-10"))

my.dat <- data.frame(start1,end1,start2,end2)

我可能应该在这里使用一个排序列表,以便为 seq.Date 提供起始值和结束值的向量,但我似乎无法让它发挥作用。相反,我的非列表方法会产生“from”参数应该等于 1 的错误(因为它无法处理起始日期的向量)。

my.dat$output <- length(seq(my.dat$start1,my.dat$end1,by=1) %in% seq(my.dat$start2,my.dat$end2,by=1))

关于 SO 上的匹配日期有很多讨论,但我似乎无法将其中任何一个翻译成多列日期。

谢谢!!

【问题讨论】:

  • seq 不接受(当然是等长)向量有点吃惊。
  • @MichaelChirico - 确实如此,但即使我已经有课程日期对象,我也必须指定 seq.Date(as.Date(start1),as.Date(end1)) - 查看我的完整回复以下。绝对让我大吃一惊。

标签: r date


【解决方案1】:

使用data.table

library(data.table)
setDT(my.dat)[,output:=pmin(end2,end1)-pmax(start2,start1)+1]

       start1       end1     start2       end2 output
1: 2011-02-10 2011-02-11 2011-02-10 2011-02-10 1 days
2: 2009-07-25 2009-07-27 2009-07-26 2009-07-27 2 days
3: 2007-12-02 2007-12-07 2007-12-08 2007-12-10 0 days
4: 2007-12-02 2007-12-07 2007-11-01 2007-12-01 0 days

可以通过将:= 的RHS 包装在as.integer 中来转换为整数。

【讨论】:

    【解决方案2】:

    当然,我在发帖后马上就想通了。但我很好奇其他人是否有更优雅的解决方案。这是我的:

    apply(my.dat[,c("start1","end1","start2","end2")],1,function(x)length((seq.Date(as.Date(x[1]),as.Date(x[2]),by=1) %in% (seq.Date(as.Date(x[3]),as.Date(x[4]),by=1)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2022-01-01
      • 2021-12-17
      • 2019-01-05
      • 2020-02-10
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多