R语言拆分多选题列并生成指定变量二进制矩阵方法咨询
R多选项拆分生成固定列二进制矩阵方案
问题背景
需要处理数据框中逗号分隔的多选题列Q12,基于预设的7个固定选项:Inhalt、Arbeit、Verhindern Koalition、Ermöglichen Koalition、Verhindern Kanzlerschaft、Ermöglichen Kanzlerschaft、Spitzenpolitiker,生成每行对应选项存在则为1、不存在为0的二进制矩阵,要求最终恰好保留上述7个选项列,未在样本中出现的选项列值统一为0。
原始Q12列示例数据:
| 行号 | Q12 |
|---|---|
| 1 | Inhalt, Ermöglichen Koalition |
| 2 | Inhalt, Ermöglichen Koalition, Verhindern Kanzlerschaft |
| 3 | Inhalt |
| 4 | Spitzenpolitiker |
已尝试方案的问题
model.matrix()方法:会把单元格内完整的字符串组合当成独立因子水平,无法拆分逗号分隔的多选项,因此生成的列数远多于预期。separate()方法:仅按逗号位置机械拆分,无法识别选项实际内容,顺序完全依赖分隔符位置,也不会自动生成0-1编码。splitstackshape::charMat()运行失败:通常是未提前做字符串清洗、未指定固定选项集合导致的。
可行实现代码
方法1:tidyverse 实现(无额外依赖包适配问题)
核心逻辑是先固定全部选项顺序,拆分长格式后转宽格式补0,兼容新旧版本tidyverse:
library(tidyverse) # 1. 先固定7个目标选项的顺序和名称,保证列不会缺失 target_options <- c( "Inhalt", "Arbeit", "Verhindern Koalition", "Ermöglichen Koalition", "Verhindern Kanzlerschaft", "Ermöglichen Kanzlerschaft", "Spitzenpolitiker" ) # 2. 处理数据 einzeln_strategisch_2021 <- strategisch_2021 %>% # 给每行加唯一行ID避免重复值出错 mutate(row_id = row_number()) %>% # 按逗号+空格拆分Q12的多选项,转成长格式,旧版tidyr可替换为separate_rows(Q12, sep = ", ") separate_longer_delim(Q12, delim = ", ") %>% # 标记选中的选项为1 mutate(value = 1) %>% # 转成宽格式,选项作为列名,未选中的位置补0 pivot_wider( names_from = Q12, values_from = value, values_fill = 0 ) %>% # 补充原始数据里没出现过的选项列,统一赋值0 add_column(!!!set_names( map(target_options[!target_options %in% colnames(.)], ~0), target_options[!target_options %in% colnames(.)] )) %>% # 按预设顺序排列选项列,保留原数据其他非Q12列 select(-row_id, all_of(target_options), everything())
示例数据运行后输出结果完全符合预期:
| 行号 | Inhalt | Arbeit | Verhindern Koalition | Ermöglichen Koalition | Verhindern Kanzlerschaft | Ermöglichen Kanzlerschaft | Spitzenpolitiker |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
方法2:splitstackshape::charMat 正确用法
使用charMat前需要统一分隔符格式,同时预先指定全量选项集合,避免列缺失:
library(splitstackshape) # 定义固定目标选项 target_options <- c( "Inhalt", "Arbeit", "Verhindern Koalition", "Ermöglichen Koalition", "Verhindern Kanzlerschaft", "Ermöglichen Kanzlerschaft", "Spitzenpolitiker" ) # 先把逗号分隔的字符串改成|分隔(charMat默认分隔符),再生成二进制矩阵 binary_mat <- charMat( gsub(", ", "|", strategisch_2021$Q12), split = "|", type = "binary", # 预先指定全部要保留的选项,避免缺失列 levels = target_options ) # 合并回原数据(去掉原Q12列) einzeln_strategisch_2021 <- cbind( strategisch_2021[, !colnames(strategisch_2021) %in% "Q12"], binary_mat )
注意事项
- 必须预先定义全部7个目标选项的向量,否则原始数据中未被选中的选项(比如示例里的Arbeit)不会出现在最终结果中,列数不符合要求。
- 拆分前注意分隔符是
,(逗号+空格),不要漏了后面的空格,否则拆分出的选项前面会带多余空格,导致匹配失败。
内容的提问来源于stack exchange,提问作者Mr. Draro
相关产品推荐
相关产品推荐

