数日前、私はこの関連スレッドを開いた: グループによる時間間隔のオーバーラップ一致
ただし、今度は複数の時間間隔の列をオーバーラップさせて、フラグ= 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)と重複していることを示す整数列です。
これが明確になることを願っています。
私はあなたが探しているものを正確に理解していないと確信しています。データでは、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
))