如何将调查问卷的勾选式答案转换为分类变量
解决多选问卷选项转分类编码问题
你的问题出在对每行单独生成因子,unique(x)在每行只有单个选项时只会返回当前选项,所以每个行的因子水平只有一个,转成数值后都是1,自然得不到预期的多编码结果。
正确的思路是先建立全局的选项-编码映射,再对每个包含多个选项的字符串拆分、匹配编码,最后合并成所需格式。
步骤1:定义全局选项编码映射
先把所有可能的选项和对应的编码一一对应,确保所有选项都被覆盖:
# 创建选项到编码的映射向量 code_map <- c( "Sun/Solar Photovoltaic" = 1, "Wind Power" = 2, "Hydel" = 3, "Biomass" = 4, "Geothermal" = 5, "Food crops" = 6, "I do not know Renewable Energy Sources" = 7 )
步骤2:构造模拟的多选项数据集(对应你的真实数据)
你的示例数据是单个选项,但实际是多选(逗号分隔),这里构造符合场景的测试数据:
data <- data.frame( ID = 1:2, CIQ_RES_choice = c( "Sun/Solar Photovoltaic, Wind Power", "Wind Power, Hydel" ), stringsAsFactors = FALSE )
步骤3:处理每个选项字符串,生成分类编码
用strsplit拆分逗号分隔的选项,再通过映射表匹配编码,最后合并成逗号分隔的字符串:
# 处理函数:拆分选项→匹配编码→合并 get_codes <- function(choice_str) { # 拆分选项,同时去除前后空格 choices <- trimws(strsplit(choice_str, ",")[[1]]) # 匹配编码 codes <- code_map[choices] # 合并成逗号分隔的字符串 paste(codes, collapse = ", ") } # 应用到数据框,生成分类编码列 data$分类编码 <- sapply(data$CIQ_RES_choice, get_codes)
最终结果
运行后得到的数据框就是你需要的格式:
> data ID CIQ_RES_choice 分类编码 1 1 Sun/Solar Photovoltaic, Wind Power 1, 2 2 2 Wind Power, Hydel 2, 3
补充说明
- 如果你的真实数据中选项有大小写不一致、额外空格的情况,可以先统一处理(比如转小写、去除多余空格),避免匹配失败。
- 如果有未在映射表中的选项,可以在
get_codes函数里添加判断,比如返回NA或者自定义编码。
内容的提问来源于stack exchange,提问作者Luca Mariani
相关产品推荐
相关产品推荐

