2015-07-20 58 views
1

我有一個數據框,其中包含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的匹配日期的討論,但我似乎無法將其中任何一個轉換爲多列日期。

謝謝!

+0

Sorta驚訝'seq'不接受(等長,當然)載體。 – MichaelChirico

+0

@MichaelChirico - 它做到了,但即使我已經有類日期對象,我不得不指定seq.Date(as.Date(start1),as.Date(end1)) - 請參閱下面的完整響應。肯定會讓我陷入循環。 – Jordan

回答

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被轉換爲整數。

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)))))