如何在R中将多选题响应转为one-hot encoding?附Excel替代方案
用R实现多选题数据的One-Hot编码(附Excel简易方案)
R实现步骤
1. 安装并加载所需包
先安装读取Excel和数据处理的工具包:
install.packages(c("readxl", "tidyr", "dplyr")) library(readxl) library(tidyr) library(dplyr)
2. 读取Excel数据
假设你的Excel文件名为remote_learning_survey.xlsx,数据位于第一个工作表:
df <- read_excel("remote_learning_survey.xlsx", sheet = 1)
可通过colnames(df)查看数据列名,确保后续引用的多选题响应列名正确。
3. 拆分选项并生成One-Hot编码
假设存储多选题响应的列名为远程学习的最佳方面?(替换为你实际的列名):
# 定义选项编号与名称的对应关系 option_mapping <- tibble( option_id = 1:15, option_name = c( "灵活性", "可访问性", "时间安排", "模块质量", "学习资源", "课前准备", "面授环节质量", "面授次数", "辅导质量", "辅导频次", "导师支持质量", "导师支持频次", "项目的包容性方法(惠及所有性别学习者)", "项目对个人信心与自我提升的影响", "项目对教学技能提升的影响" ) ) # 拆分单元格内的选项,转换为长格式后生成one-hot编码 one_hot_df <- df %>% # 拆分逗号分隔的选项编号为单独行 separate_rows(`远程学习的最佳方面?`, sep = ",") %>% # 去除编号前后空格并转为数值型 mutate(`远程学习的最佳方面?` = as.integer(trimws(`远程学习的最佳方面?`))) %>% # 关联选项名称 left_join(option_mapping, by = c("远程学习的最佳方面?" = "option_id")) %>% # 标记选中状态为1 mutate(selected = 1) %>% # 转换为宽格式(one-hot),未选中项填充0,保留原始其他列 pivot_wider( names_from = option_name, values_from = selected, values_fill = 0, id_cols = setdiff(colnames(df), "远程学习的最佳方面?") )
4. 查看结果
运行head(one_hot_df)即可看到转换后的one-hot编码数据:每个选项对应一列,1表示该选项被选中,0表示未选中。
Excel简易替代方案(适合小数据集)
如果你暂时不想用R,可尝试以下低效率但易操作的步骤(仅适合数据量小的情况):
- 拆分选项:选中响应列,用
TEXTSPLIT函数拆分逗号分隔的内容到多列,例如=TEXTSPLIT(A2, ",")。 - 设置选项表头:在空白区域列出所有15个选项名称作为列标题。
- 标记选中状态:对每个选项列,用
COUNTIF判断是否被选中,例如=IF(COUNTIF($B2:$Z2, "1"), 1, 0)(替换"1"为对应选项编号,$B2:$Z2为拆分后的列范围)。 - 批量填充:将公式复制到所有行和选项列,即可得到one-hot编码结果。
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

