使用purrr与dplyr::select批量创建二分类变量的实现方法
实现方案
最优原生方案(dplyr 1.0及以上版本推荐)
不用额外调用purrr,直接用dplyr自带的across()函数即可完成批量列处理,语法更简洁执行效率更高:
library(tidyverse) df <- tibble(z = c(0, 0), a_1 = c(.1, NA), a_2 = c(NA, .1)) out <- df %>% mutate( # 匹配所有a_开头的列做转换,.names参数指定新列的命名规则 across(starts_with("a_"), ~if_else(is.na(.x), 0, 1), .names = "{.col}_d") )
运行后得到的out和你示例的目标输出完全一致。
结合purrr的实现方案
如果你需要明确使用purrr函数完成需求,可参考以下写法:
out <- df %>% bind_cols( # 筛选目标列后逐列处理,合并为新的tibble再统一加后缀 map_dfc(select(., starts_with("a_")), ~if_else(is.na(.x), 0, 1)) %>% rename_with(~paste0(.x, "_d")) )
原代码错误说明
你之前的写法无法正常运行的核心原因有两个:
- 第一步调用
select(starts_with("a_"))会直接丢弃原表中其他不需要处理的列(比如示例中的z列),无法得到完整的输出表 map的.f参数需要传入函数对象,你直接写mutate({{.x}}_d = ...)不符合语法规范,也没有处理动态列名的生成逻辑
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

