如何用dplyr在R的dataframe中添加累积运行平均值列
问题原因
你原有代码出错的核心原因是在dplyr的mutate()上下文里混用了$提取符调用原始数据框的列,会破坏dplyr的行级运算环境,导致Grade[data$Exam <= Exam]的筛选逻辑不符合逐行累积的预期。
正确实现代码
方案1:用cumsum结合行号(兼容性最好)
library(dplyr) data <- data %>% mutate(RunningAvg = cumsum(Grade) / row_number())
如果你的Exam列是严格从1开始连续递增的序号,也可以直接除以Exam,效果完全一致:
data <- data %>% mutate(RunningAvg = cumsum(Grade) / Exam)
方案2:用dplyr内置累积均值函数(可读性更强)
dplyr 1.0.0及以上版本提供了专门的cummean()函数可以直接实现累积均值计算,代码更简洁:
data <- data %>% mutate(RunningAvg = cummean(Grade))
运行任意一种方案后都可以得到你需要的结果:
> data Exam Grade RunningAvg 1 1 90 90.00 2 2 88 89.00 3 3 95 91.00 4 4 80 88.25 5 5 82 87.00
内容的提问来源于stack exchange,提问作者Chris Ludlam
相关产品推荐
相关产品推荐

