С R и data.table:
library(data.table)
setDT(DF)
DF[, v := do.call(pmax, shift(v1, 0:3, type="lead", fill=0L)), by=id]
date id v1 v2 v
1: 2017-05-29 5206 0 0 0
2: 2017-05-30 5206 0 0 0
3: 2017-05-31 5206 0 0 0
4: 2017-06-01 5206 0 1 1
5: 2017-06-02 5206 0 1 1
6: 2017-06-03 5206 0 1 1
7: 2017-06-04 5206 1 1 1
8: 2017-05-29 5207 0 1 1
9: 2017-05-30 5207 1 1 1
10: 2017-05-31 5207 0 1 1
11: 2017-06-01 5207 1 1 1
12: 2017-06-02 5207 0 0 0
13: 2017-06-03 5207 0 0 0
14: 2017-06-04 5207 0 0 0
15: 2017-05-29 5208 0 1 1
16: 2017-05-30 5208 1 1 1
17: 2017-05-31 5208 0 0 0
18: 2017-06-01 5208 0 1 1
19: 2017-06-02 5208 0 1 1
20: 2017-06-03 5208 0 1 1
21: 2017-06-04 5208 1 1 1
date id v1 v2 v
Как это работает: shift
с типом «лидер» смотрит в будущее, в данном случае на расстояния 0, 1,2 или 3 (с неопределенными значениями, замененными на ноль).pmax
ищет максимальное значение для этих векторов, поэлементно.
Аналогично, из комментария @ RyanD:
DF[order(date), v :=
do.call(pmax, shift(v1, 0:3, type="lead", fill=0L))
, by=id]
Преимущество в том, что оно работает, даже если данныене отсортировано по date
.Он временно сортирует данные только при построении столбца.
В качестве альтернативы выполните скользящее объединение:
DF[, date := as.IDate(date)] # format
DF[, v := DF[v1 == 1][.SD, on=.(id, date), roll=-3, .N, by=.EACHI]$N]
Преимущество в том, что оно работает, даже если перечисление датнеполный.Он просматривает каждую строку DF
в DF[v1 == 1]
, считая любое совпадение на 0-3 дня в будущем.
Данные:
DF = structure(list(date = c("2017-05-29", "2017-05-30", "2017-05-31",
"2017-06-01", "2017-06-02", "2017-06-03", "2017-06-04", "2017-05-29",
"2017-05-30", "2017-05-31", "2017-06-01", "2017-06-02", "2017-06-03",
"2017-06-04", "2017-05-29", "2017-05-30", "2017-05-31", "2017-06-01",
"2017-06-02", "2017-06-03", "2017-06-04"), id = c(5206L, 5206L,
5206L, 5206L, 5206L, 5206L, 5206L, 5207L, 5207L, 5207L, 5207L,
5207L, 5207L, 5207L, 5208L, 5208L, 5208L, 5208L, 5208L, 5208L,
5208L), v1 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L,
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L), v2 = c(0L, 0L, 0L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L
)), .Names = c("date", "id", "v1", "v2"), row.names = c(NA, -21L
), class = "data.frame")