You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:23:23