如何用across或{purrr}简化dplyr数据替换补全的冗长代码?
简化填充NA值的dplyr代码方案
示例数据与映射
先定义示例数据和替换映射列表,方便验证效果:
library(tibble) # 待处理的数据框 df_modifies <- tibble( abricot = c(1, 2, NA, 4), abricot2 = c(NA, 2, 3, NA), pomme = c(5, NA, 7, 8), pomme2 = c(NA, 6, NA, 8) ) # 替换映射:键为需要填充的列,值为提供填充值的原列 corresp <- list(abricot2 = "abricot", pomme2 = "pomme")
方案1:用dplyr的across简化
这是最简洁的原生dplyr写法,直接遍历需要处理的列:
library(dplyr) df_modifies %>% mutate( across( all_of(names(corresp)), ~ if_else(is.na(.), pull(., corresp[[cur_column()]]), .) ) )
across(all_of(names(corresp))):指定要处理的列(corresp的所有键)cur_column():获取当前正在处理的列名,通过corresp[[cur_column()]]拿到对应的原列名pull(., 原列名):提取原列的对应值,用if_else判断NA并替换
方案2:用purrr的reduce迭代处理
如果习惯purrr的迭代逻辑,可以用reduce逐步处理每一列:
library(purrr) library(dplyr) reduce( names(corresp), function(df, col) { df %>% mutate(!!col := if_else(is.na(!!sym(col)), !!sym(corresp[[col]]), !!sym(col))) }, .init = df_modifies )
reduce遍历corresp的每个列名,以原数据框为初始值- 用
!!sym(col)和!!sym(corresp[[col]])实现列名的动态引用,完成NA替换
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

