含零值时rollmean计算28天滚动平均返回错误值求助
问题原因分析
从你提供的代码和示例数据来看,出现这种接近0的极小负数结果,主要有以下几个核心原因:
1. 浮点数精度运算误差
这是最常见的诱因。当滚动窗口内的数值大多为0(或总和极小)时,浮点数在二进制存储与计算过程中会出现精度损耗,最终结果会呈现出接近0的极小负数(比如你看到的 -0.000000000406)。
举个简单例子:假设窗口内28个值都是0,理论均值应为0,但受限于浮点数的运算特性,实际计算结果可能会是一个极小的非零负数——这属于计算机数值计算的正常现象,并非函数本身的错误。
2. rollmean 参数传递的隐性问题
你在 rollmean 中使用的 na.rm=TRUE 并非该函数的原生参数,而是通过 ... 传递给底层的 mean() 函数的。当滚动窗口中存在大量 NA(比如数据开头的窗口不足28行,na.pad=TRUE 自动填充了NA),na.rm=TRUE 会忽略这些NA,仅计算窗口内非NA值的均值。如果窗口内只有少数几个0(甚至仅一个0),在浮点数计算逻辑下就很容易出现这类极小值误差。
3. 原始数据的"伪0"问题
你的示例数据里 OdometerTotal 显示为0,但有可能这些值并非真正的0——而是因为数据显示精度限制,被四舍五入为0的极小负数。比如实际存储值是 -1e-12,计算28天均值后就会得到 -1e-12 / 28 ≈ -3.57e-14,和你看到的结果量级完全匹配。
验证与解决建议
- 先核查原始数据:用
print(Test2$OdometerTotal, digits=20)查看OdometerTotal的真实存储值,确认是否存在极小的非零数值。 - 若只是浮点数精度问题,可以用
round()函数对结果做格式化处理,比如mutate(Chronic = round(rollmean(OdometerTotal, 28, align="right", na.pad=TRUE, na.rm=TRUE), 6))。 - 如果是窗口内NA过多导致的计算异常,可以考虑调整
na.pad参数(比如设为FALSE,让不足窗口大小的结果保留为NA),或者先预处理数据中的缺失值再计算滚动均值。
内容的提问来源于stack exchange,提问作者NColl
相关产品推荐
相关产品推荐

