web-dev-qa-db-ja.com

グループごとの複数の時間間隔列間の重複

数日前、私はこの関連スレッドを開いた: グループによる時間間隔のオーバーラップ一致

ただし、今度は複数の時間間隔の列をオーバーラップさせて、フラグ= 1の最初のrow_number値を返す必要があるという事実に対処する必要があります。発生します。

たとえば、私は次のdfを持っています:

id    flag  row_number         time_1                             time_2              result
 1      1       1       2001-04-01 UTC--2001-05-01 UTC  1960-01-01 UTC--1962-01-01 UTC  NA
 1      1       2       2007-08-01 UTC--2007-12-01 UTC  1980-01-01 UTC--1982-01-01 UTC  NA
 1      1       3       2010-03-01 UTC--2011-03-01 UTC  1949-01-01 UTC--1951-01-01 UTC  NA
 1      0       4       2001-04-15 UTC--2001-04-20 UTC  1981-01-01 UTC--1983-01-01 UTC  NA
 1      0       5       2001-04-17 UTC--2001-05-15 UTC  1959-01-01 UTC--1961-01-01 UTC  1
 1      0       6       2007-09-01 UTC--2007-12-01 UTC  1980-01-01 UTC--1983-01-01 UTC  2
 1      0       7       2011-01-01 UTC--2011-03-05 UTC  1994-01-01 UTC--1996-01-01 UTC  NA
 1      0       8       2018-01-01 UTC--2017-12-01 UTC  1949-01-01 UTC--1951-01-01 UTC  NA

次のコードで作成されました:

library(dplyr)
library(purrr)
library(lubridate)

df <- data.frame(id=c(1, 1, 1, 1, 1, 1, 1, 1),     
             flag=c(1, 1, 1, 0, 0, 0, 0, 0),
             row_number=c(1,2,3,4,5,6,7,8),
             time_1=c(interval(ymd(20010401), ymd(20010501)),
                    interval(ymd(20070801), ymd(20071201)), 
                    interval(ymd(20100301), ymd(20110301)), 
                    interval(ymd(20010415), ymd(20010420)), 
                    interval(ymd(20010417), ymd(20010515)),
                    interval(ymd(20070801), ymd(20071201)),
                    interval(ymd(20110101), ymd(20110305)),
                    interval(ymd(20180101), ymd(20171201))),
             time_2=c(interval(ymd(19600101), ymd(19620101)),
                      interval(ymd(19800101), ymd(19820101)), 
                      interval(ymd(19490101), ymd(19510101)), 
                      interval(ymd(19810101), ymd(19830101)), 
                      interval(ymd(19590101), ymd(19610101)),
                      interval(ymd(19800101), ymd(19820101)),
                      interval(ymd(19940101), ymd(19960101)),
                      interval(ymd(19490101), ymd(19510101))),
             result = c(NA, NA, NA, NA, 1, 2, NA, NA))

これは、行のtime_1およびtime_2との重複を見つける必要があるフラグ= 0、フラグ= 1の行のすべてのtime_1およびtime_2変数。

resultは、row_numberの値がフラグ0の行とフラグ1の行で、time_1とtime_2の間隔が重複しています。この目的のために、私はlubridateパッケージのint_overlap()関数を試しました。

このコードを使用して、フラグ= 0の1つの行とフラグ== 1のany行の間にtime_1のオーバーラップがあるかどうかを識別できます。 map_int()関数

library(tidyverse)
library(lubridate)

df %>%
  group_by(id) %>%
  mutate(value = ifelse(flag == 0, map_int(time_1, ~ any(int_overlaps(.x, time_1[flag == 1]))), NA))

役立つ可能性のある関連質問: R期間間の重複を見つける

編集:row_number変数を使用して、time_1とtime_2がフラグ0の行と重複する値を持つ最初のフラグ1の行を識別する列を取得します。

id    flag  row_number         time_1                             time_2              result
1      1       1       2001-04-01 UTC--2001-05-01 UTC  1960-01-01 UTC--1962-01-01 UTC  NA

1      0       5       2001-04-17 UTC--2001-05-15 UTC  1959-01-01 UTC--1961-01-01 UTC  1

たとえば、row_number 1と5は基準を満たしています。結果は、row_number 5(フラグ0行)がtime_1およびtime_2がrow_number 1(フラグ1)と重複していることを示す整数列で​​す。

これが明確になることを願っています。

3
torakxkz

私はあなたが探しているものを正確に理解していないと確信しています。データでは、time_1とtime_2は非常に離れており、交差しません。あれは正しいですか?

たぶんこれでボールが回転します。これは、あなたの望むことですか?

df %>% 
  mutate(test = case_when(
    int_overlaps(time_1,time_2) & flag == 1 ~ T,
    int_overlaps(time_1,time_2) & flag == 0 ~ F,
    T ~ NA
    ))
0
Magnus Nordmo