/ /データフレーム内の一連の日付内の重複を比較する

データフレーム内の日付のシーケンス内のオーバーラップの比較 - r、date

2桁の開始データフレームがあります。日付と2列の終了日。 2セットのシリーズ間の重複する日付の数(つまり、start2 / end2シリーズの何日がstart1 / end1に含まれるか(ここの "output"列に表示されているように))を数えます。

      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で日付を一致させることについては多くの議論がありますが、そのいずれかを複数列の日付に変換することはできません。

ありがとう!!

回答:

回答№1は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

のRHSをラップすることで整数に変換することができます :=as.integer.


回答№2の場合は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)))))