在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
相关产品推荐
相关产品推荐

