R语言计算dataframe列中数值间NaN个数平均值(含/不含开头NaN)
R语言计算NDVI序列间隔NaN均值方案
样例数据构造
首先将你提供的样例数据转换为R中可直接使用的dataframe:
dataf <- structure(list(Time = c(20000224, 20000225, 20000226, 20000227, 20000228, 20000229, 20000301, 20000302, 20000303, 20000304, 20000305, 20000306, 20000307, 20000308, 20000309, 20000310, 20000311, 20000312, 20000313, 20000314, 20000315, 20000316, 20000317, 20000318, 20000319, 20000320, 20000321, 20000322, 20000323, 20000324, 20000325, 20000326, 20000327, 20000328, 20000329, 20000330, 20000331, 20000401, 20000402, 20000403), NDVI = c(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.562256741, 0.560792828, 0.559272321, 0.554727235, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.506596306, 0.504768168, 0.536223787, 0.5476394, 0.520311992, 0.52862363, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN)), row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame"))
实现代码
我们通过rle()函数识别连续NaN分段,再按两种逻辑筛选统计范围,封装为可直接调用的函数:
avg_nan_gap <- function(x, include_leading = FALSE) { # 计算序列中连续值的运行长度 rle_res <- rle(is.na(x)) # 提取所有NaN段和有效数值段的位置索引 nan_seg_idx <- which(rle_res$values) valid_seg_idx <- which(!rle_res$values) # 边界判断:有效数值不足两段时无法计算间隔 if (length(valid_seg_idx) < 2) { warning("有效数值数量小于2,无有效间隔可统计") return(NA_real_) } # 先过滤掉最后一段有效数值之后的NaN段(无后续有效数值,不属于间隔) filtered_nan <- nan_seg_idx[nan_seg_idx < max(valid_seg_idx)] # 按参数决定是否删除第一个有效数值之前的开头NaN段 if (!include_leading) { filtered_nan <- filtered_nan[filtered_nan > min(valid_seg_idx)] } # 无符合条件的间隔时返回0 if (length(filtered_nan) == 0) return(0) # 计算平均NaN个数 mean(rle_res$lengths[filtered_nan]) }
测试效果
# 逻辑1:包含开头NaN段,样例输出为10 avg_nan_gap(dataf$NDVI, include_leading = TRUE) # 逻辑2:仅统计有效数值之间的NaN段,样例输出为7 avg_nan_gap(dataf$NDVI, include_leading = FALSE)
代码说明
- 核心依赖基础包的
rle()函数,无需安装额外第三方包 - 自动处理有效数值不足的边界情况,避免报错
- 支持任意长度的NDVI时序数据,可直接复用
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

