如何统计R语言数据框中各月份的null/缺失值数量
R语言日度站点数据月度缺失值统计方案
针对日度站点观测数据按月统计指定字段缺失值、筛选合格月份的需求,原代码存在3个容易导致结果错误的问题:
- 未加入年份维度分组:仅提取月份数字会将不同年份的同序号月份数据合并,统计结果完全失真
- 列匹配逻辑硬编码:在管道流程中直接调用原始数据框名索引列,若前置步骤存在列增删操作会出现匹配错误
- 缺失占比计算逻辑有误:原代码中
mean(Mis)输出的是单日平均缺失字段个数,不是缺失值占当月应测总数据量的比例,无法直接作为质量判定依据
修正后的可直接运行代码如下,默认统计所有列名带"C"的观测字段:
library(dplyr) library(lubridate) # 分年月统计缺失值 month_missing_stat <- CUM00078310_df %>% mutate( Year = year(Date), Month = month(Date), # 统计每日C类字段的缺失数量 daily_mis = rowSums(is.na(pick(contains("C")))) ) %>% group_by(Year, Month) %>% summarise( # 当月缺失值总个数 sum_missing = sum(daily_mis), # 当月应观测总数据量=当月有效观测天数*参与统计的C类字段数 total_expected = n() * ncol(pick(contains("C"))), # 真实缺失率 missing_percent = sum_missing / total_expected, .groups = "drop" )
完成统计后可直接按阈值剔除低质量月份,示例为保留缺失率低于20%的月份,可根据研究需求调整阈值:
# 筛选符合质量要求的月份 valid_months <- month_missing_stat %>% filter(missing_percent < 0.2) # 过滤原始数据,仅保留合格月份的观测记录 cleaned_df <- CUM00078310_df %>% mutate(Year = year(Date), Month = month(Date)) %>% inner_join(valid_months %>% select(Year, Month), by = c("Year", "Month"))
注意:运行前请确认
Date列已通过ymd()等函数转换为R标准日期格式,否则年、月字段提取会出错。
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

