R среднее значение по конкретным строкам

#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