Я sh, чтобы использовать рекурсивную структуру в моем изменении dplyr, которая повторяет количество задержек, используемых для определенных операций. Дело в том, что я не уверен, как установить его конечную точку, поскольку она больше похожа на while
, чем на for
l oop, что делает меня немного небезопасным.
Вот некоторые образцы данных . Группы не обязательно имеют одинаковый размер и индексируются id
df <- data.frame(id = c(1, 1, 1, 1, 2,
2, 3, 4, 5, 5, 5),
p201 = c(NA, NA, "001", NA, NA, NA, "001", "001", "001", NA, NA),
V2009 = c(25, 11, 63, 75, 49, 14, 32, 31, 3, 10, 3),
ager = c(2.3, 2, 8.1, 12.1, 5.1, 2, 2.9, 2.8, 2,
2, 2),
V2007 = c(1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1)
)
I wi sh, чтобы обновить p201
в зависимости от того, насколько похожи на его задержки наблюдения в данной группе.
Вот как я поступил бы на первой итерации:
new <- df %>%
group_by(id) %>%
mutate(
p201 = ifelse(!is.na(p201), p201,
ifelse(
V2007 == lag(V2007, 1) &
abs(V2009 - lag(V2009, 1)) <= ager,
first(na.omit(p201)), p201)))
Мой вопрос в том, как я могу написать рекурсивную функцию, которая вписывается в цепочку dplyr
, которая повторяется на i
в lag(VAR, i)
- Я хочу, чтобы i
рос, пока не произойдет что-либо: в p201
больше нет NA
s, и все возможные задержки проверяются в каждой группе. Что касается последнего, следует сказать, что количество строк в каждой группе различается.
Я подумал о двух возможностях: сделать максимальное значение i
числом строк самой большой группы - 1 или это количество строк в каждой группе - 1. Я не уверен, какое решение является оптимальным, и я не знаю, как это реализовать.
Может ли кто-нибудь помочь?
Здесь желаемый результат:
# A tibble: 11 x 5
# Groups: id [5]
id p201 V2009 ager V2007
<int> <chr> <dbl> <dbl> <dbl>
1 1 NA 25 2.3 1
2 1 NA 11 2 1
3 1 001 63 8.1 1
4 1 001 75 12.2 1
5 2 NA 49 5.1 2
6 2 NA 14 2 2
7 3 001 32 2.9 1
8 4 001 31 2.8 2
9 5 001 3 2 1
10 5 NA 10 2 1
11 5 001 3 2 1