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

如何用coalesce函数批量处理多变量数据集的缺失值填充

用dat2批量填充dat1的缺失值(无需逐个指定变量)

你可以通过两种简洁的方式实现批量填充,不用手动逐个写coalesce:

方法一:用rows_patch直接修补(推荐)

dplyr的rows_patch()函数专门用来用另一个数据集的非NA值修补原数据集的缺失值,完全匹配你的需求,代码极简:

library(dplyr)

dat1 <- tibble(
  id = c("soo1", "soo2", "soo3", "soo4"),
  a1= c("Test", "Tested", "Testing", NA),
  a2= c("Math", "Eng", NA, "French"),
  a3= c("Science", NA, "Biology", "Chem"))

dat2 <- tibble(
  id = c("soo1", "soo2", "soo3", "soo4"),
  a1= c(NA, NA, NA, "Tested"),
  a2= c("Math", NA, "UK", NA),
  a3= c("Science", "Physic", NA, NA))

# 直接用dat2的非NA值填充dat1的缺失
dat_filled <- dat1 %>% rows_patch(dat2, by = "id")

print(dat_filled)

运行结果:

# A tibble: 4 × 4
  id    a1      a2     a3     
  <chr> <chr>   <chr>  <chr>  
1 soo1  Test    Math   Science
2 soo2  Tested  Eng    Physic 
3 soo3  Testing UK     Biology
4 soo4  Tested  French Chem   

方法二:用across批量处理合并后的数据集

如果需要更灵活的自定义逻辑,可以先合并两个数据集,再用across批量对所有变量执行coalesce:

dat_filled <- dat1 %>%
  inner_join(dat2, by = "id") %>%
  # 批量处理所有带.x后缀的变量(来自dat1)
  mutate(across(ends_with(".x"), 
                ~coalesce(., get(stringr::str_replace(cur_column(), ".x", ".y"))),
                # 重命名变量,去掉.x后缀
                .names = "{stringr::str_remove(.col, '.x')}")) %>%
  # 保留原变量名的列
  select(id, all_of(setdiff(names(dat1), "id")))

两种方法的区别

  • rows_patch:逻辑直白,一步到位,仅用dat2的非NA值覆盖dat1的NA,不会改变dat1已有的非NA值,最适合你的场景。
  • across批量处理:适合需要额外处理逻辑的场景(比如填充前做数据转换),但步骤稍多。

内容的提问来源于stack exchange,提问作者Moses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:54:12