You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何计算分组内排除当前值的累积均值?

分组计算排除当前行的累积均值问题

数据集

id = c(1,1,1,1,2,2,2)
year = c(2010,2011,2012,2013, 2012, 2013, 2014)
var = c(12.186300,19.069836,7.456078,14.875019,20.827933,5.029625,-2.260658)

my_data = data.frame(id, year,var)

数据集输出:

id year       var
1  1 2010 12.186300
2  1 2011 19.069836
3  1 2012  7.456078
4  1 2013 14.875019
5  2 2012 20.827933
6  2 2013  5.029625
7  2 2014 -2.260658

需求

针对id列的每个分组,计算var列的累积均值,但需排除当前行的var值,预期结果如下:

  • 第1行:NA
  • 第2行:12.186300/1 = 12.186300
  • 第3行:(12.186300 + 19.069836)/2 = 15.628068
  • 第4行:(12.186300 + 19.069836 + 7.456078)/3 = 12.904071
  • 第5行:NA
  • 第6行:20.827933/1 = 20.827933
  • 第7行:(20.827933 + 5.029625)/2 = 12.928779

错误尝试分析

尝试1:使用ave和cummean

transform(my_data, cmean = ave(var, id, FUN = cummean) - var)

输出结果:

id year       var     cmean
1  1 2010 12.186300  0.000000
2  1 2011 19.069836 -3.441768
3  1 2012  7.456078  5.447994
4  1 2013 14.875019 -1.478211
5  2 2012 20.827933  0.000000
6  2 2013  5.029625  7.899154
7  2 2014 -2.260658 10.126291

错误原因:cummean(var)是包含当前行的累积均值,减去当前值后逻辑完全错误,不是排除当前行的累积均值。

尝试2:使用分组总和计算

library(dplyr)
my_data %>%
    group_by(id) %>% 
    mutate(avg = (sum(var) - var)/(n() - 1))

输出结果:

# A tibble: 7 x 4
# Groups:   id [2]
     id  year   var   avg
  <dbl> <dbl> <dbl> <dbl>
1     1  2010 12.2  13.8 
2     1  2011 19.1  11.5 
3     1  2012  7.46 15.4 
4     1  2013 14.9  12.9 
5     2  2012 20.8   1.38
6     2  2013  5.03  9.28
7     2  2014 -2.26  7.89

错误原因:该方法计算的是整个分组排除当前行的均值,而非截至当前行之前的累积均值,与需求逻辑不符。

正确解法

方法1:dplyr实现

library(dplyr)
my_data %>%
    group_by(id) %>%
    mutate(
        cum_sum_lag = lag(cumsum(var)),
        n_lag = lag(row_number()),
        cum_mean_excl = cum_sum_lag / n_lag
    ) %>%
    select(-cum_sum_lag, -n_lag)

输出结果:

# A tibble: 7 x 4
# Groups:   id [2]
     id  year   var cum_mean_excl
  <dbl> <dbl> <dbl>         <dbl>
1     1  2010 12.2          NA   
2     1  2011 19.1         12.2  
3     1  2012  7.46        15.6  
4     1  2013 14.9         12.9  
5     2  2012 20.8          NA   
6     2  2013  5.03        20.8  
7     2  2014 -2.26        12.9  

方法2:基础R实现

my_data$cum_mean_excl <- ave(my_data$var, my_data$id, FUN = function(x) {
    cum_sum <- cumsum(x)
    cum_sum_lag <- c(NA, cum_sum[-length(cum_sum)])
    n_lag <- c(NA, seq_along(x)[-length(x)])
    cum_sum_lag / n_lag
})

输出结果:

id year       var cum_mean_excl
1  1 2010 12.186300            NA
2  1 2011 19.069836    12.1863000
3  1 2012  7.456078    15.6280680
4  1 2013 14.875019    12.9040713
5  2 2012 20.827933            NA
6  2 2013  5.029625    20.8279330
7  2 2014 -2.260658    12.9287790

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:55:33