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

在R中基于多条件将分类列转换为二进制列(支持任意单值数)

在R中将多选项列转换为动态二进制Yes/No列

针对你需要将包含多选项的列(如"A"、"A and B")转换为对应单值的Yes/No二进制列,且支持任意数量单值的需求,这里提供两种通用解决方案:

方法1:使用dplyr动态生成列

library(dplyr)
library(stringr)

# 示例数据
df <- data.frame(
  column1 = c("A", "A", "A and B", "A and B", "B", "B"),
  column2 = NA
)

# 自动提取所有唯一的单值类别
all_categories <- df$column1 %>%
  strsplit(" and ") %>%
  unlist() %>%
  unique() %>%
  sort()

# 生成对应的Yes/No列
result_df <- df %>%
  # 遍历每个类别,检查是否包含该值,生成Yes/No
  mutate(across(all_of(all_categories), 
                ~ifelse(str_detect(column1, fixed(.y)), "Yes", "No"), 
                .names = "column1_{.col}")) %>%
  # 移除原column1,调整列顺序
  select(-column1) %>%
  relocate(starts_with("column1_"), column2)

print(result_df)

代码说明:

  • 自动识别类别:通过strsplit拆分多选项内容,去重后得到所有需要生成的类别,无需硬编码适配固定值。
  • 动态生成列:用across遍历每个类别,通过str_detect(配合fixed避免正则匹配冲突)检查该行是否包含该类别,自动生成命名为column1_类别名的Yes/No列。
  • 调整列结构:移除原多选项列,将生成的二进制列前置,保留原数据的其他列。

方法2:使用tidyr的拆分-转宽流程

library(dplyr)
library(tidyr)

df <- data.frame(
  column1 = c("A", "A", "A and B", "A and B", "B", "B"),
  column2 = NA
)

result_df <- df %>%
  # 添加临时行号确保转宽后匹配原数据行数
  mutate(row_id = row_number()) %>%
  # 拆分多选项为单行
  separate_rows(column1, sep = " and ") %>%
  # 标记存在的类别为Yes
  mutate(value = "Yes") %>%
  # 转宽表,不存在的类别填充为No
  pivot_wider(names_from = column1, values_from = value, 
              values_fill = "No", names_prefix = "column1_") %>%
  # 合并原其他列,移除临时行号
  left_join(df %>% select(row_id, column2), by = "row_id") %>%
  select(-row_id) %>%
  relocate(starts_with("column1_"), column2)

print(result_df)

代码说明:

  • 拆分转宽逻辑:先将多选项拆分为单行,再通过pivot_wider转回宽表,自动为未出现的类别填充"No"。
  • 保留原数据完整性:通过临时行号绑定,确保转宽后能正确匹配原数据的其他列(如column2),避免数据错位或丢失。

两种方法都能自动适配任意数量的单值类别,比如后续数据中出现"C"、"A and C"等内容时,会自动生成对应的column1_C列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:48:25