#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 (состояние)). Итак, я не знаю идей о том, как это реализовать, используя индексы, как в методе, который вы прописали