在RStudio中编码多选项问题以适配多重对应分析(MCA)
多选项问题适配多重对应分析(MCA)的编码方案
场景一:单一选项数据修改为多选后的编码
先修正指定受试者的选项为多选格式,再转换为MCA所需的二元(0/1)编码结构:
# 加载工具包 library(tidyr) library(dplyr) # 原始数据框 s = data.frame(subjects = 1:12, Why_are_you_not_happy = c(1,2,4,5,1,2,4,3,2,1,3,4)) # 更新指定受试者的多选选项(用逗号分隔字符串表示多选) s <- s %>% mutate(Why_are_you_not_happy = case_when( subjects == 3 ~ "1,2,5", subjects == 7 ~ "3,4", subjects == 10 ~ "1,5", TRUE ~ as.character(Why_are_you_not_happy) )) # 转换为MCA兼容的二元编码:每个选项对应一列,选中为1,未选中为0 s_mca <- s %>% separate_rows(Why_are_you_not_happy, sep = ",") %>% mutate(value = 1) %>% pivot_wider(names_from = Why_are_you_not_happy, values_from = value, values_fill = 0) %>% rename_with(~paste0("Why_", .x), -subjects) # 重命名避免纯数字列名
关键步骤说明
- 用
case_when统一将选项转为字符串格式,适配多选场景 separate_rows把每行的多选选项拆分为独立行pivot_wider将长格式数据转成宽格式,自动填充未选中选项为0- 重命名选项列,避免纯数字列名引发的语法问题
场景二:已有逗号分隔多选数据的编码
针对现有包含两个多选项问题的数据,直接批量转换为二元编码后执行MCA:
# 加载工具包 library(tidyr) library(dplyr) library(FactoMineR) # 原始数据框 df <- data.frame(subjects = 1:12, Why_are_you_not_happy = c(1,2,"1,2,5",5,1,2,"3,4",3,2,"1,5",3,4), why_are_you_sad = c("1,2,3",1,2,3,"4,5,3",2,1,4,3,1,1,1) ) # 定义批量转换函数:单多选项列转二元编码 multichoice_to_binary <- function(data, col_name) { data %>% select(subjects, all_of(col_name)) %>% separate_rows(all_of(col_name), sep = ",") %>% mutate(value = 1) %>% pivot_wider(names_from = all_of(col_name), values_from = value, values_fill = 0) %>% rename_with(~paste0(col_name, "_", .x), -subjects) } # 分别处理两个多选项问题 happy_binary <- multichoice_to_binary(df, "Why_are_you_not_happy") sad_binary <- multichoice_to_binary(df, "why_are_you_sad") # 合并编码结果 df_mca <- happy_binary %>% inner_join(sad_binary, by = "subjects") # 执行多重对应分析(将subjects设为补充变量,不参与维度计算) mca_result <- MCA(df_mca, quali.sup = 1, graph = TRUE)
关键步骤说明
- 封装
multichoice_to_binary函数,实现多选项列的批量编码 - 合并两个问题的编码结果,完整保留每个受试者的选项状态
- 使用
FactoMineR的MCA函数执行分析,通过quali.sup标记不参与计算的受试者ID列
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

