【问题标题】:R average from specific rows特定行的 R 平均值
【发布时间】:2021-02-08 22:20:45
【问题描述】:

我有一个示例性的 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)

【问题讨论】:

    标签: r mean rolling-computation


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多