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

如何用同组其他成员的行均值替换数据框中的NA值

用分组均值填充缺失值

现有一份分组数据,每个唯一ID对应一个分组,部分ID的字段存在缺失值(NA),需要将这些NA替换为对应字段中同组其他成员的均值。例如:ID3的V_2字段NA值需替换为A组其他成员V_2的平均值(21与22的均值);ID7的V_3字段NA值需替换为C组其他成员V_3的平均值(34与64的均值)。

原始数据与问题说明

原始代码构造的数据存在格式问题:生成的df以行为变量、列为样本,且缺失值是字符串"NA"而非R语言标准的缺失值NA,需要先修正数据结构和类型:

# 原始构造代码
Group=rep(c('A', 'B', 'C'), each=3)
id=1:9
V_1 = t(c(10,20,30,40,10,10,20,35,65))
V_2 = t(c(21,22,"NA",42,12,12,22,32,63))
V_3 = t(c(24,24,34,44,14,14,"NA",34,64))

df <- as.data.frame(rbind(Group, id, V_1, V_2, V_3))

输出的原始df结构如下:

Group  A  A  A  B  B  B  C  C  C
id     1  2  3  4  5  6  7  8  9
X     10 20 30 40 10 10 20 35 65
X.1   21 22 NA 42 12 12 22 32 63
X.2   24 24 34 44 14 14 NA 34 64

解决方案步骤

1. 修正数据结构与类型

首先将数据转置为样本行、变量列的格式,同时将字符串"NA"转换为R标准缺失值,并把数值列转为数值类型:

# 转置数据,设置列名
df_t <- as.data.frame(t(df))
colnames(df_t) <- c("Group", "id", "V_1", "V_2", "V_3")

# 转换变量类型:id转为整数,V_1/V_2/V_3转为数值,同时将"NA"转为NA
df_t$id <- as.integer(df_t$id)
df_t[, c("V_1", "V_2", "V_3")] <- lapply(df_t[, c("V_1", "V_2", "V_3")], function(x) {
  as.numeric(ifelse(x == "NA", NA, x))
})

修正后的数据结构如下:

Group id V_1 V_2 V_3
1     A  1  10  21  24
2     A  2  20  22  24
3     A  3  30  NA  34
4     B  4  40  42  44
5     B  5  10  12  14
6     B  6  10  12  14
7     C  7  20  22  NA
8     C  8  35  32  34
9     C  9  65  63  64

2. 用分组均值填充缺失值

这里提供两种实现方式:

方式一:使用dplyr包(代码更清晰)

先安装并加载dplyr,然后按Group分组,对每个数值列用同组非NA值的均值填充NA:

# 首次使用需安装dplyr
# install.packages("dplyr")
library(dplyr)

df_filled <- df_t %>%
  group_by(Group) %>%
  mutate(across(c(V_1, V_2, V_3), ~ ifelse(is.na(.), mean(., na.rm = TRUE), .))) %>%
  ungroup()
方式二:使用base R

用ave函数按组计算均值并填充:

df_filled_base <- df_t
for(col in c("V_1", "V_2", "V_3")){
  df_filled_base[[col]] <- ave(df_filled_base[[col]], df_filled_base$Group, 
                               FUN = function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))
}

填充结果

两种方式得到的填充后数据一致,关键部分如下:

  • ID3的V_2被填充为A组V_2的均值:(21+22)/2 = 21.5
  • ID7的V_3被填充为C组V_3的均值:(34+64)/2 = 49

完整填充后的数据:

# A tibble: 9 × 5
  Group    id   V_1   V_2   V_3
  <chr> <int> <dbl> <dbl> <dbl>
1 A         1    10  21    24  
2 A         2    20  22    24  
3 A         3    30  21.5  34  
4 B         4    40  42    44  
5 B         5    10  12    14  
6 B         6    10  12    14  
7 C         7    20  22    49  
8 C         8    35  32    34  
9 C         9    65  63    64  

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:25:11