如何缩短dplyr中批量修正nbeta_depXX变量值的冗余语法?
你可以使用dplyr内置的if_all()和across()函数简化逻辑,无需手动重复每个变量的判断规则,即使后续新增nbeta_dep前缀的变量也不需要修改代码,还能避免复制粘贴带来的笔误问题。
简化实现代码
suppressMessages(library(dplyr)) test <- tribble( ~ent, ~dep_impl, ~nbeta_dep01, ~nbeta_dep02, ~nbeta_dep03, ~nbeta_dep04, ~nbeta_dep05, "a", "01", 0, 0, 0, 0, 0, "b", "03", 2, 0, 3, 0, 1, "c", "05", 0, 0, 0, 1, 0, "d", "02", 0, 0, 0, 0, 0 ) # 核心逻辑 test %>% # 先计算所有nbeta_dep系列变量是否全为0的标识列,提升可读性 mutate(all_zero = if_all(starts_with("nbeta_dep"), ~.x == 0)) %>% # 遍历所有nbeta_dep系列变量统一做判断 mutate(across(starts_with("nbeta_dep"), ~ifelse( all_zero & sub("nbeta_dep", "", cur_column()) == dep_impl, 1, .x ))) %>% # 删除临时生成的标识列 select(-all_zero)
逻辑说明
if_all(starts_with("nbeta_dep"), ~.x == 0)自动校验所有前缀匹配的列是否全部为0,替代你重复写的多变量等于0的判断条件across(starts_with("nbeta_dep"))自动遍历所有nbeta_dep开头的变量,不需要逐个手动指定变量名cur_column()可以获取当前正在处理的列名,通过字符串提取得到变量的后缀编号,和dep_impl匹配即可自动对应到需要修改的变量
运行上述代码得到的结果和你现有实现完全一致,还规避了你原始代码里nbeta_dep04判断逻辑重复校验两次nbeta_dep04==0的笔误问题。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

