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

如何用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导致均值结果为NA
  • ungroup():取消分组,将数据恢复为普通的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:42:34