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

如何在R中将多选项独热编码变量合并为单个变量?

合并多选问卷独热编码列的解决方案

需求说明

将数据中以相同前缀(如Context_、Disposition_)命名的独热编码多选列,分别合并为单个汇总列:

  • 若某行对应分组的所有独热编码列全为0,标注自定义文本(如Disposition分组的"无压力也不忧郁")
  • 否则将值为1的列名后缀用逗号拼接
  • 保留原数据中其他非独热编码变量
  • 代码需适配更多同格式的分组列

示例数据

df <- data.frame(
  ID = c(1, 2, 3),
  Context_Family = c(0, 1, 0),
  Context_Friends = c(1, 1, 0),
  Context_Spouse = c(0, 1, 0),
  Context_Alone = c(0, 0, 1),
  Disposition_Stress = c(0, 1, 0),
  Disposition_Melancholic = c(1, 1, 0),
  Stress = c(20, 24, 35)
)

解决方案(dplyr + tidyr实现)

通过动态识别前缀、批量处理分组列的方式实现,代码可自动适配新增的同格式分组:

library(dplyr)
library(tidyr)
library(stringr)

# 提取所有独热编码列的前缀
prefixes <- df %>%
  select(matches("^\\w+_\\w+$")) %>%
  colnames() %>%
  str_extract("^\\w+") %>%
  unique()

# 定义处理单个前缀分组的函数
process_group <- function(prefix, df) {
  df %>%
    select(ID, starts_with(prefix)) %>%
    pivot_longer(cols = -ID, names_to = "key", values_to = "val") %>%
    filter(val == 1) %>%
    mutate(category = str_remove(key, paste0(prefix, "_"))) %>%
    group_by(ID) %>%
    summarise(!!prefix := ifelse(n() == 0, 
                                 ifelse(prefix == "Disposition", "无压力也不忧郁", "无对应情境"),
                                 paste(category, collapse = ", "))) %>%
    ungroup()
}

# 批量处理所有分组,并与原数据的非独热编码列合并
result <- df %>%
  select(-matches("^\\w+_\\w+$")) %>%
  reduce(prefixes, ~left_join(.x, process_group(.y, df), by = "ID"), .init = .)

# 查看结果
print(result)

输出结果

ID Stress                Context           Disposition
1  1     20                Friends         Melancholic
2  2     24 Family, Friends, Spouse Stress, Melancholic
3  3     35                  Alone 无压力也不忧郁

代码说明

  1. 前缀识别:通过正则匹配提取所有前缀_后缀格式列的前缀,自动识别需要处理的分组
  2. 分组处理函数:对每个分组列执行转长格式、筛选值为1的行、提取后缀、拼接文本的操作,全0时根据分组返回自定义提示
  3. 合并结果:先保留原数据的非独热编码列,再将所有处理后的分组列左连接回去,确保不丢失原有变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:00