У меня есть df вроде:
df <- tibble(a = seq(ymd('2020-01-01'), ymd('2020-02-01'), "1 day"),
b = sample(0:1, 32, prob = c(0.9, 0.1), replace = T))
Я хочу создать другой df с вызванным флагом, который равен 1, если значение b в этой строке или в следующих 6 строках равно 1, иначе это ноль
Я слышал об опережающих и запаздывающих операторах dplyr, но не очень уверен, как их использовать. Мы будем благодарны за любую помощь.
df1 <- df %>%
mutate(out = ifelse(1 %in% lead(b, 7), 1, 0))
С решением для зоопарка df выглядит так, как показано ниже, а это не то, что я хочу, потому что здесь первая 1 в b
происходит в 2020-01-02, поэтому первый ряд out
до того, как он должен иметь 1 (потому что это происходит либо в той строке b, либо в следующих 6 строках b.) Строки с 3 по 5 также не должны быть 1, потому что в этих строках или 6 нет 1 в b строки после них.
set.seed(70)
df <- tibble(a = seq(ymd('2020-01-01'), ymd('2020-02-01'), "1 day"),
b = sample(0:1, 32, prob = c(0.9, 0.1), replace = T))
df2 <- df %>%
mutate(out = +(zoo::rollapplyr(b, width = 7, FUN = function(x) any(x == 1), partial = TRUE)))
a b out expected_out
1 2020-01-01 0 0 1
2 2020-01-02 1 1 1
3 2020-01-03 0 1 0
4 2020-01-04 0 1 0
5 2020-01-05 0 1 0
6 2020-01-06 0 1 1
7 2020-01-07 0 1 1
8 2020-01-08 0 1 1
9 2020-01-09 0 0 1
10 2020-01-10 0 0 1
11 2020-01-11 0 0 1
12 2020-01-12 1 1 1
13 2020-01-13 0 1 0
14 2020-01-14 0 1 0
15 2020-01-15 0 1 0
16 2020-01-16 0 1 0
17 2020-01-17 0 1 0
18 2020-01-18 0 1 0
19 2020-01-19 0 0 0
20 2020-01-20 0 0 0
21 2020-01-21 0 0 1
22 2020-01-22 0 0 1
23 2020-01-23 0 0 1
24 2020-01-24 0 0 1
25 2020-01-25 0 0 1
26 2020-01-26 0 0 1
27 2020-01-27 1 1 1
28 2020-01-28 0 1 0
29 2020-01-29 0 1 0
30 2020-01-30 0 1 0
31 2020-01-31 0 1 0
32 2020-02-01 0 1 0