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

如何一次性为DataFrame添加多列1/0分类标识列(替代重复ifelse)

高效实现分类列的二进制标记

推荐两种比逐个写ifelse更高效的方法,既能生成每个分类对应的1/0标记列,又能完整保留原有数据的长格式变量:

方法一:用dplyr::across批量生成

直接在原数据集上批量创建标记列,代码简洁且易维护:

library(dplyr)

df <- data.frame(
  ID = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
  cat = c("TS", NA, NA, "TS", "1", "1", NA, NA, "2", NA, NA, NA)
)

# 提取所有非空的分类值
categories <- unique(df$cat[!is.na(df$cat)])

# 批量生成标记列,自动命名为cat_分类名
df <- df %>%
  mutate(across(all_of(categories), 
                ~as.integer(cat == .x),  # 匹配分类则为1,否则为0
                .names = "cat_{.col}")) %>%
  mutate(across(starts_with("cat_"), ~replace_na(.x, 0)))  # 把NA替换为0

方法二:结合pivot_wider快速生成后合并

如果分类数量多,这种方法能自动识别所有分类并生成对应列,一步到位:

library(dplyr)
library(tidyr)

df <- data.frame(
  ID = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
  cat = c("TS", NA, NA, "TS", "1", "1", NA, NA, "2", NA, NA, NA)
)

# 生成分类标记的宽格式临时表
cat_markers <- df %>%
  mutate(value = 1) %>%
  pivot_wider(names_from = cat, values_from = value, 
              names_prefix = "cat_", values_fill = 0)

# 和原数据合并(行顺序一致,直接绑定列即可)
df <- bind_cols(df, cat_markers %>% select(-ID))

这两种方法都能替代重复的ifelse操作,而且当后续新增分类时,不需要修改代码,自动适配新的分类值。

内容的提问来源于stack exchange,提问作者tchoup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:00:51