R语言处理含NA的调查数据生成哑变量的更优编码方法
R语言调查数据重编码实现方案
针对当前需求的极简基础R写法
完全匹配你的赋值规则,不需要嵌套ifelse,逻辑更清晰:
# 第一步将空字符串转为NA df$Q57[df$Q57 == ""] <- NA # 直接根据匹配结果生成哑变量:等于"从不做"赋值0,其余非空值赋值1,NA保持不变 df$Q57_dummy <- as.integer(df$Q57 != "I would never install water control structures") # 校验结果 table(df$Q57_dummy , useNA = "always")
核心逻辑是R中逻辑值转整数时,TRUE对应1、FALSE对应0、NA转完仍然是NA,刚好符合你的需求。
通用多分类重编码方案(适配后续更复杂的重编码需求)
如果后续需要处理超过3种赋值结果的题目,用命名向量映射的方式可维护性最高,不需要写多层嵌套判断:
# 自定义原值到目标值的映射关系,后续新增分类直接修改此处即可,注意字符串和实际取值完全匹配 value_map <- c( "" = NA_real_, "I would never do this" = 0, "I will do this in five years" = 1, "I will do this in 10 years" = 1, "I will do this eventually" = 1 ) # 直接按原值匹配赋值 df$Q57_dummy <- value_map[df$Q57]
tidyverse 生态写法(适合批量处理多道调查题)
如果你常用tidyverse套件处理数据,用case_when函数可以实现更灵活的规则配置,配合across还可以批量处理多道结构一致的调查题:
library(dplyr) df <- df %>% mutate( # 将空字符串转为NA Q57 = na_if(Q57, ""), # 按规则重编码 Q57_dummy = case_when( Q57 == "I would never install water control structures" ~ 0, !is.na(Q57) ~ 1 ) )
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

