R 特定行的平均值
R average from specific rows
我有一个示例性的 data.frame,其中包含两列,'month' 和 'value'。
我想使用当前和上个月的数据计算每一行的平均值,而不需要各自的观察本身。这意味着 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)
对于 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
我有一个示例性的 data.frame,其中包含两列,'month' 和 'value'。
我想使用当前和上个月的数据计算每一行的平均值,而不需要各自的观察本身。这意味着 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)
对于 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