You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:24:53