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

在R中实现多列数据的跨列One-hot编码的简洁方法

R语言实现多列颜色的存在式One-Hot编码

构造输入数据

先还原你的输入数据框:

df <- data.frame(
  主颜色 = c("red", "yellow"),
  次颜色 = c("blue", "red"),
  第三颜色 = c("green", NA),
  stringsAsFactors = FALSE
)

方法一:Base R原生实现(无需额外包)

通过提取所有唯一颜色,逐行检查颜色是否存在:

# 获取所有非NA的唯一颜色
all_colors <- unique(unlist(df))
all_colors <- all_colors[!is.na(all_colors)]

# 逐颜色生成存在标记:每行只要有该颜色就标记1,否则0
result <- sapply(all_colors, function(color) {
  as.integer(rowSums(df == color, na.rm = TRUE) > 0)
})

# 转换为数据框格式
result_df <- as.data.frame(result)

方法二:Tidyverse风格实现

利用dplyr和tidyr的格式转换功能,代码更直观:

library(tidyverse)

result_df <- df %>%
  # 添加行号用于分组标记每行数据
  mutate(row_id = row_number()) %>%
  # 转为长格式,自动过滤NA值
  pivot_longer(-row_id, values_to = "color", values_drop_na = TRUE) %>%
  # 标记该颜色在当前行存在
  mutate(value = 1) %>%
  # 转回宽格式,缺失的颜色标记为0
  pivot_wider(names_from = color, values_from = value, values_fill = 0) %>%
  # 移除辅助行号列
  select(-row_id)

方法三:用fastDummies包快速实现

如果习惯用专门的编码工具包,可以用fastDummies简化操作:

library(fastDummies)

result_df <- df %>%
  # 把每行的非NA颜色合并为逗号分隔的字符串
  mutate(all_colors = apply(., 1, function(x) paste(na.omit(x), collapse = ","))) %>%
  # 对合并后的字符串进行拆分编码
  dummy_cols(select_columns = "all_colors", split = ",") %>%
  # 筛选出编码结果列并去掉前缀
  select(starts_with("all_colors_")) %>%
  rename_with(~gsub("all_colors_", "", .))

以上三种方法都能得到你需要的结果,可根据自己的代码习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:01