如何用dplyr按性别和年龄组均值批量填充缺失值?
用dplyr管道按分组均值批量填充缺失值
完全可以用dplyr的管道流实现这个需求,核心思路是先按指定维度分组,再批量对目标列用组内均值替换NA值,具体代码如下:
library(dplyr) # 按性别和年龄组分组,批量填充lab1、lab2的NA值 df_filled <- df %>% group_by(gender, age_group) %>% mutate( # 批量处理lab1和lab2,用组内均值填充NA across(c(lab1, lab2), ~coalesce(., mean(., na.rm = TRUE))) ) %>% ungroup()
代码解释
group_by(gender, age_group):将数据按性别和年龄组拆分,确保后续计算的均值是同组内的统计值across(c(lab1, lab2), ...):批量指定需要处理的列,如果你的实际数据中有更多类似lab前缀的列,可以用across(starts_with("lab"), ...)自动匹配,无需逐个输入列名;如果要处理所有数值列,用across(where(is.numeric), ...)更高效coalesce(., mean(., na.rm = TRUE)):coalesce函数会保留原列中的非NA值,仅将NA替换为后面的计算值;mean(., na.rm = TRUE)计算组内均值时忽略NA,避免因组内存在NA导致均值结果为NAungroup():取消分组,将数据恢复为普通的tibble结构,避免后续操作受分组影响
填充结果示例
运行上述代码后,填充后的数据集如下:
df_filled # A tibble: 8 x 5 id gender age_group lab1 lab2 <dbl> <chr> <dbl> <dbl> <dbl> 1 1 m 1 3.5 5 2 1 m 1 3 4 3 2 w 2 2 3 4 2 w 2 3 3 5 3 w 2 2 1 6 4 m 1 3.5 4 7 4 m 1 4 3 8 5 w 2 1 5
扩展说明
如果需要用中位数而非均值填充,只需将mean替换为median即可:
mutate(across(c(lab1, lab2), ~coalesce(., median(., na.rm = TRUE))))
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

