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

如何按列分组为不同类别填充缺失值?R语言实操求助

分组填充缺失值的解决方案

嘿,我来帮你搞定这个分组填充缺失值的问题!你已经算出各组均值的思路完全正确,接下来只需要把这些均值对应填充到每组的NA里就行,给你几个实用的方法:

方法1:直接分组后替换(最简洁)

用dplyr的group_by + mutate组合,在分组内直接计算均值并替换NA,一步到位:

library(dplyr)

# 先构造你的数据框(注意字符串要加引号,不然会被识别为变量报错)
df <- data.frame(
  Context = c("HUM", "HUM", "DEV", "HUM", "DEV", "HUM", "DEV"),
  Amount = c(100, 150, NA, NA, 500, 150, 600)
)

# 分组填充缺失值
df_filled <- df %>%
  group_by(Context) %>%
  mutate(Amount = ifelse(is.na(Amount), mean(Amount, na.rm = TRUE), Amount)) %>%
  ungroup() # 记得取消分组,避免后续操作受影响

print(df_filled)

运行后你会看到:

  • HUM组的NA会被替换成HUM的均值(100+150+150)/3 = 133.3333
  • DEV组的NA会被替换成DEV的均值(500+600)/2 = 550

方法2:用提前计算的均值表填充

如果你已经提前算出了各组均值(就像你之前用summarise得到的结果),可以通过合并数据集来填充:

# 先计算并保存各组均值
mean_df <- df %>%
  group_by(Context) %>%
  summarise(mean_amount = mean(Amount, na.rm = TRUE)) %>%
  ungroup()

# 合并数据并替换NA
df_filled <- df %>%
  left_join(mean_df, by = "Context") %>% # 把均值表合并到原数据
  mutate(Amount = ifelse(is.na(Amount), mean_amount, Amount)) %>%
  select(-mean_amount) # 删掉临时的均值列

print(df_filled)

这个方法适合需要复用均值的场景,比如后续还要用这些均值做其他计算的情况。

方法3:用tidyr::replace_na简化代码

如果你习惯用tidyr,可以用replace_na函数让代码更简洁:

library(tidyr)
library(dplyr)

df_filled <- df %>%
  group_by(Context) %>%
  mutate(Amount = replace_na(Amount, mean(Amount, na.rm = TRUE))) %>%
  ungroup()

replace_na会直接把指定列的NA替换成你传入的值,这里就是组内的均值,代码更清爽。

小提醒

  • 原始数据里的HUM和DEV要加引号,不然R会把它们当成未定义的变量,直接报错。
  • 如果某个组的Amount全是NA,mean(..., na.rm = TRUE)会返回NaN,这时候你可以根据需求调整,比如改成mean(..., na.rm = TRUE) %||% 0(需要rlang包)来替换成0,或者其他默认值。

内容的提问来源于stack exchange,提问作者BloopFloopy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:40