Как создать переменную, которая использует предыдущий (запаздывающий) экземпляр своего собственного значения?

#r #recursion #lag

#r #рекурсия #задержка

Вопрос:

Существует набор данных панели. Я должен вычислить новую переменную:

 cases_new = 3^(lag(cases, n=1L))
 

только для первой даты. Затем, начиная со 2-й даты, она использует lag (т.е. Предыдущий экземпляр) для своего собственного значения, т.е.:

 cases_new = 3^lag(cases_new, n=1L)
 

Я попытался реализовать, используя следующий код:

 df2 <-df1 %>%
  mutate(cases_new = if_else(date == "2020-01-01", 3^(lag(cases, n=1L)), 3^(lag(cases_new, n=1L)))
 

Но он выдал сообщение об ошибке, в котором указано, что объект ‘cases_new’ не найден. Я даже пытался инициализировать cases_new до приведенного выше назначения с помощью:

 df1$cases_new <- NA
 

Но это не обновилось cases_new правильно (я получаю все NAs). Может ли кто-нибудь помочь мне с этой конкретной рекурсивной реализацией?

Ответ №1:

Вы могли бы решить свою проблему инициализации следующим образом:

 df2 <-df1 %>%
  mutate(
    cases_new = 3^(lag(cases, n=1L)),
    cases_new = if_else(date == "2020-01-01", cases_new, 3^(lag(cases_new, n=1L)))
  )
 

НО я не думаю, что это даст вам нужные значения. Вам придется перебирать строки следующим образом:

 cases_new <- c(3^(lag(cases, n=1L)), rep(0, nrow(df1) - 1))
for (i in 2:nrow(df1)) {
  cases_new[i] <- 3^(lag(cases_new[i - 1], n=1L))
}
df1$cases_new <- cases_new
 

Комментарии:

1. Спасибо за ответ! У меня есть немного более сложное требование. Задержка должна быть ограничена в пределах каждого состояния в наборе данных панели (т.е. group_by (состояние)). Итак, я не знаю идей о том, как это реализовать, используя индексы, как в методе, который вы прописали