#r #mean #rolling-computation
#r #среднее #скользящее вычисление
Вопрос:
У меня есть примерный data.frame с двумя столбцами: «месяц» и «значение».
Я хотел бы рассчитать среднее значение для каждой строки, используя данные текущего и предыдущего месяца без самого соответствующего наблюдения. Это означает среднее значение n-1 строк, где n — количество строк текущего и предыдущего месяца.
Я знаю, как вычислить среднее значение n-1 по всем строкам (см. Столбец ‘mean_k_1’).
Чего все еще не хватает, так это спецификации n , что означает, что вместо всех строк следует учитывать только строки текущего и предыдущего месяца.
Ожидаемый результат находится в столбце ‘mean_lag’.
Вот MWE:
month <- as.Date(c("2020-01-01", "2020-01-01", "2020-02-01", "2020-02-01", "2020-02-01", "2020-03-01",
"2020-04-01", "2020-04-01", "2020-04-01", "2020-05-01", "2020-05-01"))
value <- c(102, 110, 98, 76, 320, 419, 215, 50, 99, 46, 129)
mean_lag <- c(110, 102, 152, 157.5, 96.5, 164.7, 189.3, 244.3, 228.0, 123.3, 102.5)
df <- cbind.data.frame(month, value, mean_lag)
n <- nrow(df)
df$mean_k_1 <- (mean(df$value)*n - df$value)/(n-1)
Ответ №1:
Для каждого значения month
мы берем mean
все значения за текущий и предыдущий месяц, исключая текущее наблюдение.
library(dplyr)
library(lubridate)
df %>%
mutate(mean_lag_res = purrr::map_dbl(row_number(), ~{
val <- month[.x]
mean(value[-.x][between(month[-.x], val %m-% months(1), val)])
}))
# month value mean_lag mean_lag_res
#1 2020-01-01 102 110.0 110.0
#2 2020-01-01 110 102.0 102.0
#3 2020-02-01 98 152.0 152.0
#4 2020-02-01 76 157.5 157.5
#5 2020-02-01 320 96.5 96.5
#6 2020-03-01 419 164.7 164.7
#7 2020-04-01 215 189.3 189.3
#8 2020-04-01 50 244.3 244.3
#9 2020-04-01 99 228.0 228.0
#10 2020-05-01 46 123.3 123.2
#11 2020-05-01 129 102.5 102.5