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
相关产品推荐
相关产品推荐

