如何在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的行、提取后缀、拼接文本的操作,全0时根据分组返回自定义提示
- 合并结果:先保留原数据的非独热编码列,再将所有处理后的分组列左连接回去,确保不丢失原有变量
内容的提问来源于stack exchange,提问作者Codrin Mironiuc
相关产品推荐
相关产品推荐

