如何将数据框数值列中的NA值替换为对应列的中位数?
R数据框数值列缺失值中位数填充方案
方案1:dplyr 1.0.0+ 推荐写法(使用across)
直接搭配dplyr的across函数批量处理所有数值列即可,非数值列会自动保留不做修改:
# 加载dplyr包 library(dplyr) # 中位数填充数值列NA my_df_filled <- my_df %>% mutate( across(where(is.numeric), ~ifelse(is.na(.), median(., na.rm = TRUE), .)) )
参数说明:
where(is.numeric)筛选所有数值类型的列,仅对这些列执行填充操作na.rm = TRUE必须设置,否则计算列中位数时会因为存在NA返回NA,无法完成填充- 如果需要保留原数值列、生成独立的填充后列,可以给
across增加.names参数:across(..., .names = "{.col}_filled"),生成的新列会自动带上_filled后缀
方案2:旧版dplyr兼容写法(mutate_if)
如果你使用的是1.0.0之前的dplyr版本,可以和你用到的select_if对应,用mutate_if实现相同效果:
my_df_filled <- my_df %>% mutate_if(is.numeric, ~ifelse(is.na(.), median(., na.rm = TRUE), .))
效果验证
你提供的示例数据运行填充后,my_values_1和my_values_2的NA都会被替换为对应列的中位数8.5,分组列my_groups保持原样。
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

