R语言中按国家分组用观测均值对data frame的NA值进行插补
R按国家分组用组内均值插补缺失值方案
方法1:dplyr 简洁方案(推荐)
无需手动写循环,逻辑清晰易维护:
library(dplyr) my_data <- my_data %>% # 按国家字段分组 group_by(Country) %>% # 对所有数值列做插补,NA替换为当前国家对应列的均值 mutate(across(where(is.numeric), ~ifelse(is.na(.x), mean(.x, na.rm = TRUE), .x))) %>% # 取消分组,避免后续操作受分组逻辑影响 ungroup()
- 如果你只想对指定列做插补(比如仅
Battles、Riots两列),把across(where(is.numeric),替换为across(c(Battles, Riots),即可 - 可直接适配你的示例数据,无需额外调整字段名
方法2:Base R 原生方案(无需安装第三方包)
在你原有循环逻辑的基础上增加国家分组嵌套即可:
# 定义需要插补的列,可根据你的实际数据调整索引,示例数据里是第3、4列 cols_to_impute <- 3:ncol(my_data) # 提取所有唯一国家值 countries <- unique(my_data$Country) # 外层循环遍历需要插补的列 for(i in cols_to_impute) { # 内层循环遍历每个国家,计算组内均值做插补 for(cntry in countries) { target_rows <- my_data$Country == cntry col_vals <- my_data[target_rows, i] group_mean <- mean(col_vals, na.rm = TRUE) my_data[target_rows, i][is.na(col_vals)] <- group_mean } }
边界情况提示:如果某个国家的某一列所有值都是NA,均值计算会返回NaN,你可以根据需求额外加判断逻辑,替换为全列均值、0或其他自定义值。
内容的提问来源于stack exchange,提问作者Ümit
相关产品推荐
相关产品推荐

