У меня есть данные временного ряда с тремя столбцами: столбец значений, столбец group_var (используется для группировки) и столбец даты. Для каждой строки в кадре данных я хотел бы получить среднее значение для этой группы строк после дальнейшего разбиения на определенные временные рамки. Вот пример кода для подмножества:
df$value[df$date >= (current_row$date - 545) & df$date <= (current_row$date - 365)]
После того, как я получу это подмножество, я могу легко применить mean (), но где я застрял, так это то, как я могу заставить этот код работать с чем-то вроде этого:
df %>%
group_by(group_var) %>%
mutate(subset_mean = mean(df$value[df$date >= (current_row$date - 545) & df$date <= (current_row$date - 365)])
)
Проблема, которую я вижу, заключается в том, что я не думаю, что могу использовать df внутри строки mutate () после того, как сгруппирую исходный df. Также я не уверен, как я могу создать переменную current_row для ссылки на текущую строку для вычисления подмножества данных.
Изменить: добавлены данные примера и воспроизводимый код
library(dplyr)
date <- c("2016-02-03", "2016-06-14", "2016-03-15", "2017-04-16","2016-01-27", "2016-01-13", "2017-04-24", "2017-06-15")
date <- date %>% as.Date(format = "%Y-%m-%d")
val <- c(10, 20, 50, 70, 30, 44, 67, 42)
group_var <- c("A", "B", "B", "A", "B", "A", "A", "B")
df <- data.frame(date, val, group_var)
df %>%
group_by(group_var)
Добавлен пример данных / входов — person rstats23 schedule 12.03.2021
Чтобы подтвердить, ищете ли вы среднее значение в окне, которое было между 545 и 365 днями ранее? — person rstats23 schedule 12.03.2021
Да, это временные рамки, для которых я хочу разбить данные. От 545 до 365 дней до собственной даты каждой строки. Могут быть некоторые строки, в которых их подмножество не будет иметь строк, в этом случае возвращаемое subset_mean должно быть Н / Д. — person rstats23 schedule 12.03.2021
Спасибо, я исправил это — person rstats23 schedule 12.03.2021
Добро пожаловать в StackOverflow, @ rstats23. Пожалуйста, подумайте о том, чтобы проголосовать за решения, которые работают для вас. Для решения, которое вы считаете наиболее привлекательным, также отметьте это решение как принятое, установив флажок. Спасибо! — person rstats23 schedule 13.03.2021
Я бы посоветовал использовать для этого
slider::slide_index_dbl
:С обновленными данными я получаю
Спасибо, похоже, это именно то, что я ищу! — person rstats23; 12.03.2021
Если бы я добавил еще один столбец, содержащий логические значения, и хотел бы вычислить subset_mean только для строк, в которых логическое значение было ИСТИНА, как бы это сработало? Я добавил код, который я пробовал с ifelse () и case_when (), в исходный пост — person rstats23; 12.03.2021
Да ладно, я понял! — person rstats23; 12.03.2021
1) Это можно сделать с помощью самостоятельного соединения с помощью sql:
давая:
2) или мы можем использовать оконные функции SQL:
давая:
Lubridate представляет собой очень элегантное решение …
Вот решение, в котором используется пакет
dplyr
.Создано 12 марта 2021 года пакетом REPEX (v0.3.0)