基于R语言的调查问卷NA值处理及分析流程咨询
问卷缺失值处理+多选题合并实操方案
一、核心问题梳理
- 区分真实未作答缺失和跳转题导致的逻辑缺失,不能一刀切删除NA
- 解决多选题多列合并时的数据错位bug
- 分析性别与特定问题缺失的相关性
二、分步解决方案
1. 先处理跳转题的逻辑缺失
跳转题的NA不是用户未作答,是问卷规则导致的无需作答,必须先标记这类NA,否则缺失统计会失真:
# 示例:假设Q1选"是"才需要答Q2-Q5,先创建跳转标记列 data$skip_Q2Q5 <- ifelse(data$Q1 == "是", FALSE, TRUE) # 将跳转导致的NA替换为"逻辑缺失",与真实NA做区分 data[, c("Q2","Q3","Q4","Q5")] <- lapply(data[, c("Q2","Q3","Q4","Q5")], function(x) { ifelse(data$skip_Q2Q5, "逻辑缺失", as.character(x)) })
后续统计缺失时,仅针对非“逻辑缺失”的NA进行计算。
2. 优化多选题合并(解决错位问题)
你之前的for循环容易因变量名冲突(循环内Family_situation与列名重名)或因子匹配错误导致错位,改用向量化操作更稳定高效:
# 先把SP01-SP03转为数值型,避免因子匹配的NA坑 data$SP01_num <- ifelse(data$SP01 == "Oui", 1, 0) data$SP02_num <- ifelse(data$SP02 == "Oui", 1, 0) data$SP03_num <- ifelse(data$SP03 == "Oui", 1, 0) # 处理other项:有有效内容则记为1 data$SP0_other_num <- ifelse(!is.na(data$SP0_other) & nchar(trimws(data$SP0_other)) > 0, 1, 0) # 行求和统计选择数,无任何选择则设为NA data$Family_situation <- rowSums(data[, c("SP01_num","SP02_num","SP03_num","SP0_other_num")], na.rm = TRUE) data$Family_situation <- ifelse(data$Family_situation == 0, NA, data$Family_situation)
3. 统计真实缺失值
过滤掉逻辑缺失样本后,统计真实未作答的数量与比例:
# 统计Q6的真实缺失数 true_missing_Q6 <- sum(is.na(data$Q6) & !data$skip_Q6) # 按性别分组计算缺失率,使用dplyr更便捷 library(dplyr) data %>% filter(!skip_Q6) %>% # 仅保留需要作答Q6的样本 group_by(gender) %>% summarise(missing_rate_Q6 = mean(is.na(Q6))) # 缺失率=缺失样本数/总有效样本数
4. 性别与缺失的相关性分析
用卡方检验看关联性,或逻辑回归控制其他变量:
# 卡方检验:性别与Q6是否缺失的关联性 missing_table <- table(data$gender, is.na(data$Q6) & !data$skip_Q6) chisq.test(missing_table) # 逻辑回归:加入年龄等控制变量,分析性别对缺失的影响 model <- glm(I(is.na(Q6) & !skip_Q6) ~ gender + age, data = data, family = binomial) summary(model)
三、实用提醒
- 保留原多选题列是正确的,后续交叉分析(比如不同性别选“已婚”的比例)仍需用到原列数据
- 500+样本量下,向量化操作足够高效,无需复杂优化
- 每一步处理后建议保存中间数据,方便回溯验证
内容的提问来源于stack exchange,提问作者Natasha44
相关产品推荐
相关产品推荐

