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

如何正确编码调查条件问题并处理含多选的DataFrame缺失值

处理带条件多选的R数据集:消除NA+拆分多选

核心思路

  1. 填补条件问题的NA:对未满足作答条件的受访者(如Q1选0的用户),将对应Q2的NA替换为明确标识,避免与真实缺失混淆;同理处理Q4。
  2. 拆分多选选项:提供两种常用处理方式——长格式(每行对应一个受访者的单个选项)和宽格式(每个选项为二进制列),适配不同分析需求。

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:35:21