如何在R中计算满足移动窗口最小非NA值要求的滚动均值
带非NA值数量阈值的滚动均值实现方案
原来的caTools::runmean默认只要窗口内有至少1个非NA值就会计算均值,没有内置的非NA值阈值判断参数,你可以用更灵活的自定义滚动窗口函数实现需求,这里提供两种常用的实现方式:
方式1:使用tidyverse生态的slider包(适配dplyr语法)
slider是tidyverse官方推出的滚动计算工具包,和dplyr的mutate等函数兼容性很好:
library(dplyr) library(slider) # 生成示例数据 data <- data.frame(dats=c(3,4,NA,4,NA,NA,6,NA,8,1,4,NA,2,NA,NA,6,NA,NA,9,5,NA,8,NA,3)) # 窗口大小设为3,要求最少2个非NA值才返回均值,否则返回NA data <- data %>% mutate( rmean_filter = slide_dbl( dats, .f = function(x) { valid_count <- sum(!is.na(x)) # 阈值可根据需求自行修改 if (valid_count >= 2) { mean(x, na.rm = TRUE) } else { NA_real_ } }, .before = 1, # 窗口包含当前值+前1个值,总长度为3 .after = 0, .complete = FALSE ) )
方式2:使用zoo包的rollapply函数
如果你习惯用zoo的滚动计算接口,也可以用以下方案:
library(dplyr) library(zoo) data <- data.frame(dats=c(3,4,NA,4,NA,NA,6,NA,8,1,4,NA,2,NA,NA,6,NA,NA,9,5,NA,8,NA,3)) data$rmean_zoo <- rollapply( data$dats, width = 3, FUN = function(x) { valid_count <- sum(!is.na(x)) if (valid_count >=2) { mean(x, na.rm = TRUE) } else { NA_real_ } }, fill = NA, align = "right" # 对齐逻辑和caTools::runmean默认设置一致 )
参数调整说明
- 你可以根据实际需求修改判断条件里的非NA值阈值,比如要求窗口内所有值都为非NA才计算,直接把条件改为
valid_count == 3即可 - 窗口大小、对齐方式也可以对应调整,和你原来使用
caTools::runmean的参数逻辑兼容
内容的提问来源于stack exchange,提问作者margon0815
相关产品推荐
相关产品推荐

