R语言按产品填充Amount列缺失值:用非缺失月份均值计算
解决方案
方法一:使用dplyr包(tidyverse风格)
先加载dplyr工具包,按Product分组后,批量处理所有Amount开头的列,用对应产品该列的非缺失值均值填充NA:
library(dplyr) # 基于原始数据框(仅保留Month、Product、Amount1、Amount2列)处理 df_filled <- df %>% group_by(Product) %>% mutate(across(starts_with("Amount"), ~coalesce(., mean(., na.rm = TRUE)))) %>% ungroup()
核心逻辑说明:
group_by(Product):确保每个产品单独计算自身的列均值,不会跨产品混淆across(starts_with("Amount")):一次性批量处理所有Amount开头的列,不用单独写两列的逻辑coalesce(., mean(., na.rm = TRUE)):将每个NA值替换为该组对应列的非缺失值均值
方法二:使用data.table包(大数据场景更高效)
如果你的数据量较大,data.table的处理速度会更有优势:
library(data.table) setDT(df) # 按Product分组,填充Amount1、Amount2的NA filled_amounts <- df[, lapply(.SD, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)), by = Product, .SDcols = c("Amount1", "Amount2")] # 合并回原数据的Month和Product列 df_filled <- cbind(df[, .(Month, Product)], filled_amounts)
结果验证
处理后的df_filled中,Amount1、Amount2列会和示例里的Calculated1、Calculated2完全匹配:
- 产品A的Amount1均值为(100+200)/2=150,填充了Month2的NA
- 产品B的Amount1均值为(200+400)/2=300,填充了Month3的NA
- 产品A的Amount2均值为(100+300)/2=200,填充了Month2的NA
- 产品B的Amount2均值为(200+500)/2=350,填充了Month2的NA
内容的提问来源于stack exchange,提问作者Arun kumar
相关产品推荐
相关产品推荐

