我有一个包含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提供起始值和结束值的向量,但我似乎无法让它工作。相反,我的非列表方法产生的错误是&#34;来自&#34;参数应该等于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上匹配日期的讨论很多,但我似乎无法将其中任何一个转换为多列日期。
谢谢!
答案 0 :(得分:2)
使用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
可以通过在:=
中包装as.integer
的RHS来转换为整数。
答案 1 :(得分:0)
当然,我在发布后就知道了。但我很好奇其他人是否有更优雅的解决方案。这是我的:
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)))))