如何正确编码调查条件问题并处理含多选的DataFrame缺失值
处理带条件多选的R数据集:消除NA+拆分多选
核心思路
- 填补条件问题的NA:对未满足作答条件的受访者(如Q1选0的用户),将对应Q2的NA替换为明确标识,避免与真实缺失混淆;同理处理Q4。
- 拆分多选选项:提供两种常用处理方式——长格式(每行对应一个受访者的单个选项)和宽格式(每个选项为二进制列),适配不同分析需求。
代码实现
1. 加载工具包
library(tidyverse)
2. 原始数据集
questions = data.frame(subjects = 1:12, Are_you_happy = c(1,0,1,1,1,0,0,1,1,1,0,0), why_are_you_happy = c("1,2,5",NA,1,2,3,NA,NA,"1,3",2,2,NA,NA), Are_you_angry = c(0,0,1,1,1,1,1,0,0,0,0,0), why_are_you_angry = c(NA,NA,"1,2,3",6,1,1,2,NA,NA,NA,NA,NA))
3. 替换条件型NA
把未符合作答条件的NA替换为明确文本,确保无缺失值:
questions_clean <- questions %>% mutate( why_are_you_happy = case_when( Are_you_happy == 0 ~ "未作答-不符合条件", TRUE ~ as.character(why_are_you_happy) ), why_are_you_angry = case_when( Are_you_angry == 0 ~ "未作答-不符合条件", TRUE ~ as.character(why_are_you_angry) ) )
4. 处理多选问题
方式一:长格式拆分(适合频次统计)
将逗号分隔的多选选项拆分为单行单个选项,保留所有受访者记录:
full_long <- questions_clean %>% # 拆分快乐原因多选 separate_rows(why_are_you_happy, sep = ",") %>% # 拆分愤怒原因多选 separate_rows(why_are_you_angry, sep = ",") %>% # 转换选项为整数(可选,根据需求调整) mutate( why_are_you_happy = ifelse(why_are_you_happy == "未作答-不符合条件", "未作答-不符合条件", as.integer(why_are_you_happy)), why_are_you_angry = ifelse(why_are_you_angry == "未作答-不符合条件", "未作答-不符合条件", as.integer(why_are_you_angry)) )
方式二:宽格式二进制编码(适合建模)
将每个多选选项转为独立列,用1表示选中、0表示未选中(含未符合条件的情况):
# 处理快乐原因的二进制列 happy_wide <- questions_clean %>% separate_rows(why_are_you_happy, sep = ",") %>% mutate( value = ifelse(why_are_you_happy != "未作答-不符合条件", 1, 0), reason_col = paste0("happy_reason_", why_are_you_happy) ) %>% pivot_wider(names_from = reason_col, values_from = value, values_fill = 0) # 处理愤怒原因的二进制列 angry_wide <- questions_clean %>% separate_rows(why_are_you_angry, sep = ",") %>% mutate( value = ifelse(why_are_you_angry != "未作答-不符合条件", 1, 0), reason_col = paste0("angry_reason_", why_are_you_angry) ) %>% pivot_wider(names_from = reason_col, values_from = value, values_fill = 0) # 合并得到最终宽格式数据集 full_wide <- questions_clean %>% select(subjects, Are_you_happy, Are_you_angry) %>% left_join(happy_wide, by = "subjects") %>% left_join(angry_wide, by = "subjects")
结果说明
- 替换NA后,所有单元格均有明确值,彻底消除缺失。
- 长格式便于统计各选项的选择频次,宽格式更适合后续机器学习、回归分析等场景。
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

