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

在R语言中按group1、group.2分组替换缺失值的方法

按分组替换R语言数据中的缺失值

没问题,要按group1和group.2这两个分组变量来替换缺失值,其实就是在你现有的dplyr代码基础上加上分组逻辑就行,我给你详细说明两种可行的写法,包括dplyr的新语法和兼容旧版本的写法:

核心思路

先通过group_by()指定分组变量(这里是group1和group.2),让后续的均值计算局限在每个分组内部,再对目标列(x1、x2)执行缺失值替换,最后用ungroup()取消分组,避免影响后续操作。


方法1:使用dplyr 1.0.0+推荐的across()语法

这是现在dplyr官方推荐的写法,比旧的mutate_at更灵活:

首先加载dplyr包:

library(dplyr)

然后处理你的完整数据集:

# 先定义你的可复现数据
mydata <- structure(list(group1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), group.2 = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), x1 = c(20L, 4L, 91L, NA, 94L, 69L, 38L, NA, 29L, 69L, 55L, 86L, 81L, 11L, NA, 12L, 65L, 90L, 74L, NA, 49L, 90L), x2 = c(44L, 94L, NA, 1L, 67L, NA, 73L, 22L, 44L, 24L, NA, 54L, 70L, 65L, 97L, 10L, 97L, NA, 74L, 97L, 34L, 29L)), class = "data.frame", row.names = c(NA, -22L))

# 分组替换缺失值
mydata_filled <- mydata %>%
  group_by(group1, group.2) %>%
  # 对所有以x开头的列,用分组内均值替换NA
  mutate(across(starts_with("x"), ~ replace_na(., mean(., na.rm = TRUE)))) %>%
  ungroup()

这里用replace_na()函数专门处理缺失值替换,比ifelse更简洁直观,如果你需要保留数值型判断(避免对非数值列误操作),可以改成:

mutate(across(starts_with("x"), ~ ifelse(is.na(.) & is.numeric(.), mean(., na.rm = TRUE), .)))

方法2:兼容旧版dplyr的mutate_at写法

如果你还在使用较旧版本的dplyr,可以沿用你熟悉的mutate_at语法,只需要加上分组:

mydata_filled <- mydata %>%
  group_by(group1, group.2) %>%
  mutate_at(vars(starts_with("x")), funs(ifelse(is.na(.) & is.numeric(.), mean(., na.rm = TRUE), .))) %>%
  ungroup()

用你的小型测试数据集验证

我们用你提供的小型数据集测试一下效果:

# 加载小型测试数据
small_data <- structure(list(group1 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), group.2 = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), x1 = c(63L, 67L, 57L, NA, 65L, 75L, 57L, 80L, 42L, NA, 35L, 80L), x2 = c(46L, 1L, NA, 41L, 80L, NA, 74L, 73L, NA, 13L, 83L, NA)), class = "data.frame", row.names = c(NA, -12L))

# 处理后查看结果
small_data_filled <- small_data %>%
  group_by(group1, group.2) %>%
  mutate(across(starts_with("x"), ~ replace_na(., mean(., na.rm = TRUE)))) %>%
  ungroup()

print(small_data_filled)

输出结果里,每个分组的NA都会被替换成该分组对应列的均值:

  • 比如group1=1, group.2=1的x2缺失值会被替换成(46+1)/2 = 23.5
  • group1=1, group.2=2的x1缺失值会被替换成(65+75)/2 = 70
  • 以此类推,完全符合分组替换的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:54:47