2017-05-26 15 views
0

私は多くのID、beginおよびendの日付のパネルを持っています。 beginend日付は、intervalの時間を作成します。グループ別の期間内に日付を見つける

id  begin  end      interval overlap 
1: 1 2010-01-31 2011-06-30 2009-08-04 UTC--2011-12-27 UTC TRUE 
2: 1 2011-01-31 2012-06-30 2010-08-04 UTC--2012-12-27 UTC TRUE 
3: 1 2012-01-31 2013-06-30 2011-08-04 UTC--2013-12-27 UTC TRUE 
4: 1 2013-01-31 2014-06-30 2012-08-04 UTC--2014-12-27 UTC TRUE 
5: 1 2013-02-28 2013-07-31 2012-09-01 UTC--2014-01-27 UTC TRUE 
6: 1 2015-02-28 2015-03-31 2014-09-01 UTC--2015-09-27 UTC TRUE 
7: 1 2015-06-30 2015-07-31 2015-01-01 UTC--2016-01-27 UTC TRUE 
8: 1 2015-09-30 2016-01-31 2015-04-03 UTC--2016-07-29 UTC TRUE 
9: 2 2010-01-31 2011-06-30 2009-08-04 UTC--2011-12-27 UTC TRUE 
10: 2 2011-01-31 2012-06-30 2010-08-04 UTC--2012-12-27 UTC TRUE 
11: 2 2012-01-31 2013-06-30 2011-08-04 UTC--2013-12-27 UTC TRUE 
12: 2 2013-01-31 2014-06-30 2012-08-04 UTC--2014-12-27 UTC TRUE 
13: 2 2013-02-28 2013-07-31 2012-09-01 UTC--2014-01-27 UTC TRUE 
14: 2 2015-02-28 2015-03-31 2014-09-01 UTC--2015-09-27 UTC TRUE 
15: 2 2015-06-30 2015-07-31 2015-01-01 UTC--2016-01-27 UTC TRUE 
16: 2 2015-09-30 2016-01-31 2015-04-03 UTC--2016-07-29 UTC TRUE 

IはIDごとに、begin/end日付のいずれかが(同じIDの)別のintervalに含まれているかどうかをテストする必要があります。

たとえば、id1begin(2010-01-31)は、id1の最初の行に含まれていない期間には含まれません。ただし、id1endの日付(2011-06-30)は2行目の間隔に含まれます(2010-08-04 UTC - 2012-12-27 UTC)。

データテーブルにlubridate間隔と%within%を試しましたが、対応する期間に含まれているのでTRUEになります。同じIDの他の期間にそれが含まれているかどうかを知る必要があります。

customer[begin %within% interval | end %within% interval, overlap := TRUE, by = id]

私はdata.tableのfoverlapをチェックするが、別のテーブルやその他の問題を結合するためのデザインだけでなく、not panels間隔のベクトルいるようですしています。

アイデア?

データ:

structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 
2, 2, 2), begin = structure(c(14640, 15005, 15370, 15736, 15764, 
16494, 16616, 16708, 14640, 15005, 15370, 15736, 15764, 16494, 
16616, 16708), class = "Date"), end = structure(c(15155, 15521, 
15886, 16251, 15917, 16525, 16647, 16831, 15155, 15521, 15886, 
16251, 15917, 16525, 16647, 16831), class = "Date"), interval = structure(c(75600000, 
75686400, 75686400, 75600000, 44323200, 33782400, 33782400, 41731200, 
75600000, 75686400, 75686400, 75600000, 44323200, 33782400, 33782400, 
41731200), start = structure(c(1249344000, 1280880000, 1312416000, 
1344038400, 1346457600, 1409529600, 1420070400, 1428019200, 1249344000, 
1280880000, 1312416000, 1344038400, 1346457600, 1409529600, 1420070400, 
1428019200), tzone = "UTC", class = c("POSIXct", "POSIXt")), tzone = "UTC", class = structure("Interval", package = "lubridate")), 
    overlap = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)), .Names = c("id", 
"begin", "end", "interval", "overlap"), row.names = c(NA, -16L 
), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000000140788>) 

答えて

2

ここでは、lubridateからint_overlapsを使用して、それを行うための一つの方法です。私は開始日と終了日の間隔を定義していますが、あなたのデータは異なっていますが、どちらが正しいかを明確にすることができます。

library(lubridate) 

df$interval <- interval(as.POSIXct(df$begin),as.POSIXct(df$end)) 

df <- df[order(df$id),] #needs to be sorted by id for next stage to work 

df$overlap <- unlist(tapply(df$interval, #loop through intervals 
          df$id, #grouped by id 
          function(x) rowSums(outer(x,x,int_overlaps))>1)) 
            #check if more than one overlap in subset for that id 


df 
    id  begin  end      interval overlap 
1 1 2010-01-31 2011-06-30 2010-01-31 UTC--2011-06-30 UTC TRUE 
2 1 2011-01-31 2012-06-30 2011-01-31 UTC--2012-06-30 UTC TRUE 
3 1 2012-01-31 2013-06-30 2012-01-31 UTC--2013-06-30 UTC TRUE 
4 1 2013-01-31 2014-06-30 2013-01-31 UTC--2014-06-30 UTC TRUE 
5 1 2013-02-28 2013-07-31 2013-02-28 UTC--2013-07-31 UTC TRUE 
6 1 2015-02-28 2015-03-31 2015-02-28 UTC--2015-03-31 UTC FALSE 
7 1 2015-06-30 2015-07-31 2015-06-30 UTC--2015-07-31 UTC FALSE 
8 1 2015-09-30 2016-01-31 2015-09-30 UTC--2016-01-31 UTC FALSE 
9 2 2010-01-31 2011-06-30 2010-01-31 UTC--2011-06-30 UTC TRUE 
10 2 2011-01-31 2012-06-30 2011-01-31 UTC--2012-06-30 UTC TRUE 
11 2 2012-01-31 2013-06-30 2012-01-31 UTC--2013-06-30 UTC TRUE 
12 2 2013-01-31 2014-06-30 2013-01-31 UTC--2014-06-30 UTC TRUE 
13 2 2013-02-28 2013-07-31 2013-02-28 UTC--2013-07-31 UTC TRUE 
14 2 2015-02-28 2015-03-31 2015-02-28 UTC--2015-03-31 UTC FALSE 
15 2 2015-06-30 2015-07-31 2015-06-30 UTC--2015-07-31 UTC FALSE 
16 2 2015-09-30 2016-01-31 2015-09-30 UTC--2016-01-31 UTC FALSE 
関連する問題