移动平均(order=13)两端缺失值替换失效问题咨询
问题分析与解决办法
你遇到的问题核心在于NA的比较逻辑——在R里,NA == NA的结果并不是TRUE,而是NA!这就导致你的ifelse(df$mavg == NA, ...)里的判断条件全是NA,ifelse遇到NA时会返回NA,所以整个mavg列都变成了NA,这就是代码失效的原因。
正确的解决方式
方法1:用is.na()定位并替换
这就是你提到的which(is.na())的思路,直接定位所有NA的位置,然后把中位数赋值过去:
# 先计算移动平均 df$mavg <- ma(df$column1, order=13) # 计算移动平均序列的中位数(忽略NA) ma_median <- median(df$mavg, na.rm = TRUE) # 定位NA的位置并替换 df$mavg[is.na(df$mavg)] <- ma_median
方法2:修正ifelse的判断条件
如果还是想用ifelse,只要把判断条件改成is.na(df$mavg)就行,这样能正确识别NA值:
df$mavg <- ma(df$column1, order=13) ma_median <- median(df$mavg, na.rm = TRUE) df$mavg <- ifelse(is.na(df$mavg), ma_median, df$mavg)
补充说明
- 提前把中位数存成变量
ma_median会更高效,避免重复计算中位数。 - 13阶移动平均首尾各6个NA是正常的,因为移动平均需要足够的窗口数据,首尾没有足够的相邻值来计算,所以产生NA。
内容的提问来源于stack exchange,提问作者Balki
相关产品推荐
相关产品推荐

