Вы можете использовать "[<-"()
, чтобы присвоить NA
позиции, где выполняется условие.
library(dplyr)
df %>%
mutate(lag1 = `[<-`(return, which(condition == 1) + 1, NA),
lag2 = `[<-`(return, which(condition == 1) + 1:2, NA),
lag3 = `[<-`(return, which(condition == 1) + 1:3, NA))
Если вы не хотите писать одну строку для каждого лага, тогда вы можно установить любые задержки для векторного объекта и применить mutate()
итеративно с помощью reduce()
в purrr
.
library(purrr)
lag_num <- 1:3
reduce(lag_num,
~ mutate(.x, !!paste0("lag", .y) := `[<-`(return, which(condition == 1) + 1:.y, NA)),
.init = df)
Соответствующая версия base
R:
Reduce(function(x, y){
x[[paste0("lag", y)]] <- `[<-`(x$return, which(x$condition == 1) + 1:y, NA)
return(x)
}, lag_num, init = df)
Выход
# # A tibble: 10 x 6
# date condition return lag1 lag2 lag3
# <date> <dbl> <int> <int> <int> <int>
# 1 2020-05-28 0 1 1 1 1
# 2 2020-05-29 0 2 2 2 2
# 3 2020-05-30 1 3 3 3 3
# 4 2020-05-31 0 4 NA NA NA
# 5 2020-06-01 0 5 5 NA NA
# 6 2020-06-02 0 6 6 6 NA
# 7 2020-06-03 0 7 7 7 7
# 8 2020-06-04 0 8 8 8 8
# 9 2020-06-05 0 9 9 9 9
# 10 2020-06-06 0 10 10 10 10