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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:07