如何用同组其他成员的行均值替换数据框中的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
相关产品推荐
相关产品推荐

