如何用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
相关产品推荐
相关产品推荐

