Я использую rollmean()
для 4- и 5-летних средних данных временных рядов.Средние значения не могут быть посчитаны по группам («Оценка» в df), поэтому я использую purrr::nest()
.
Я понимаю, что могу заменить значение на 0, скажем, но мне интересно, какие другие подходы существуют без0 заполнить?
Конечным результатом, который я ищу, будет скользящее среднее по сгруппированной переменной с как можно меньшим числом NA - я чувствую, что мой подход не соответствует этой последней точке.
Данные:
csr_ <- tribble(~Year_, ~Grade, ~AttndRise,
2016,"K5", 1.0000000,
2017,"K5", 1.0000000,
2018,"K5", 0.7562500,
2016, "Gr. 1", 0.9448276,
2017, "Gr. 1", 1.0000000,
2018, "Gr. 1", 0.7625000,
2016, "Gr. 2", 1.0000000,
2017, "Gr. 2", 1.0000000,
2018, "Gr. 2", 0.8709677,
2016, "Gr. 3", 1.1240876,
2017, "Gr. 3", 1.0000000,
2018, "Gr. 3", 0.8467153,
2016, "Gr. 4", 0.7857143,
2017, "Gr. 4", 1.0000000,
2018, "Gr. 4", 0.9635036,
2016, "Gr. 5", 0.7685950,
2017, "Gr. 5", 1.0000000,
2018, "Gr. 5", 0.9480519,
2016, "Gr. 6", 0.9462366,
2017, "Gr. 6", 1.0000000,
2018, "Gr. 6", 1.0247934)
Процесс
csr_ %>%
group_by(Grade) %>%
nest() %>%
mutate(data = map(data, ~ .x %>%
mutate(four_year = rollmean(x= AttndRise, k = 3, align = "center", fill = NA )))) %>%
unnest()
##result
# A tibble: 21 x 4
Grade Year_ AttndRise four_year
<chr> <dbl> <dbl> <dbl>
K5 2016 1 NA
K5 2017 1 0.919
K5 2018 0.756 NA
Gr. 1 2016 0.945 NA
Gr. 1 2017 1 0.902
Gr. 1 2018 0.762 NA
Gr. 2 2016 1 NA
Gr. 2 2017 1 0.957
Gr. 2 2018 0.871 NA
Gr. 3 2016 1.12 NA
# … with 11 more rows
#note that this smaller data set I have reduced k to 3 instead of 4 & 5.
Результат более преувеличен с меньшим набором данных, с большим, мы можем видеть, как каждый "край"вложенного DF (первый и последний год каждого класса) присваивается значение NA
:
Спасибо!