R语言:多同信息因子列转颜色哑变量的工具函数问询
把多列重复信息的因子列转成哑变量的R方法
嘿,这个需求确实很常见!我来给你分享几个在R里快速把多列颜色因子转成哑变量的方法,都是日常用得比较多的路子:
首先咱们先把你给出的示例数据搭出来,方便后续测试:
df <- data.frame( y = c(1,2,1,4,2,3), color1 = c("r","b","b","g","r","b"), color2 = c("b",NA,"g",NA,NA,"r"), color3 = c(NA,NA,"r",NA,NA,NA) )
方法一:用tidyverse(dplyr+tidyr)实现
这个方法逻辑直观,适合已经在用tidyverse做数据处理的场景:
library(tidyverse) # 第一步:把多列颜色转成长格式,过滤掉NA值,标记存在的颜色为1 long_df <- df %>% pivot_longer(cols = starts_with("color"), names_to = NULL, values_to = "color") %>% filter(!is.na(color)) %>% mutate(exists = 1) # 第二步:转成宽格式,每个颜色作为一列,缺失的补0,最后和原y列匹配 dummy_df <- long_df %>% pivot_wider(names_from = color, values_from = exists, values_fill = 0) %>% group_by(y) %>% summarise(across(everything(), sum)) %>% # 同一行的多个颜色合并求和 right_join(df %>% select(y), by = "y") %>% # 保留所有原始的y值 mutate(across(-y, ~replace_na(., 0))) # 没有该颜色的行补0 # 查看结果 dummy_df
运行后就能得到每个颜色对应的哑变量列,某行只要在任意color列里出现过该颜色,对应列就是1,否则是0。
方法二:用Base R实现(无需额外安装包)
要是你不想装额外的包,用Base R自带的函数也能搞定:
# 先提取所有不重复的颜色(去掉NA) unique_colors <- unique(unlist(df[, startsWith(names(df), "color")])) unique_colors <- unique_colors[!is.na(unique_colors)] # 为每个颜色生成哑变量列 dummy_cols <- lapply(unique_colors, function(color) { # 检查每行的颜色列里是否包含当前颜色,是则返回1,否则0 apply(df[, startsWith(names(df), "color")], 1, function(row) { as.integer(color %in% row) }) }) # 组合成最终的数据框 dummy_df_base <- cbind(df["y"], do.call(cbind, dummy_cols)) names(dummy_df_base)[-1] <- unique_colors # 查看结果 dummy_df_base
方法三:用fastDummies包快速生成
如果你经常需要处理哑变量,fastDummies包是个不错的选择,操作更简洁:
library(fastDummies) # 先把每行的所有非NA颜色合并成一个用逗号分隔的字符串 df$colors <- apply(df[, startsWith(names(df), "color")], 1, function(x) { paste(na.omit(x), collapse = ",") }) # 一键生成哑变量,按逗号拆分颜色字符串 dummy_df_fast <- dummy_cols(df, select_columns = "colors", split = ",") %>% select(y, starts_with("colors_")) %>% # 只保留y和生成的哑变量列 rename_with(~gsub("colors_", "", .), starts_with("colors_")) # 去掉列名前缀 # 查看结果 dummy_df_fast
这几种方法最终得到的结果都是你想要的每个颜色对应的哑变量,后续直接把这些哑变量作为x变量代入模型就可以啦~
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

