如何将基于问题列的dataframe转换为基于答案列的dataframe
将分类变量转换为独热编码的R实现方法
下面提供几种简洁的方法实现你需要的DataFrame转换,核心是对are_you_sad和are_you_worried这两个分类列生成独热编码(One-Hot Encoding),同时保留subjects列。
方法1:使用tidyverse工具链(dplyr + tidyr)
这种方法逻辑清晰,适合需要自定义编码规则的场景:
library(dplyr) library(tidyr) # 原始数据 questions <- data.frame(subjects = 1:8, are_you_sad = c(1,1,2,3,4,5,3,2), are_you_worried = c(1,3,1,2,2,4,5,3)) # 自定义转换函数 one_hot_encode <- function(df, id_col, cols_to_encode) { df %>% # 将需要编码的列转为长格式 pivot_longer(cols = all_of(cols_to_encode), names_to = "question", values_to = "response") %>% # 拼接列名(原列名_响应值) mutate(response = paste0(question, "_", response)) %>% # 转回宽格式,生成独热编码 pivot_wider( id_cols = all_of(id_col), names_from = response, values_fn = ~1, # 存在的响应标记为1 values_fill = 0 # 不存在的响应标记为0 ) } # 调用函数得到结果 result <- one_hot_encode(questions, id_col = "subjects", cols_to_encode = c("are_you_sad", "are_you_worried")) print(result)
方法2:使用fastDummies包(最简实现)
fastDummies包专门用于生成独热编码,一行代码即可完成转换:
library(fastDummies) # 直接生成独热编码,自动删除原始分类列 result <- dummy_cols( questions, select_columns = c("are_you_sad", "are_you_worried"), remove_selected_columns = TRUE ) print(result)
方法3:基础R实现(无需额外包)
如果不想加载第三方包,可以用model.matrix实现:
# 原始数据 questions <- data.frame(subjects = 1:8, are_you_sad = c(1,1,2,3,4,5,3,2), are_you_worried = c(1,3,1,2,2,4,5,3)) # 提取主键列 subjects_df <- data.frame(subjects = questions$subjects) # 对are_you_sad生成独热编码 sad_dummies <- model.matrix(~ factor(questions$are_you_sad) - 1) colnames(sad_dummies) <- paste0("are_you_sad_", 1:5) # 对are_you_worried生成独热编码 worried_dummies <- model.matrix(~ factor(questions$are_you_worried) - 1) colnames(worried_dummies) <- paste0("are_you_worried_", 1:5) # 合并所有列 result <- cbind(subjects_df, sad_dummies, worried_dummies) print(result)
以上三种方法都能得到你需要的输出格式,其中fastDummies方法最为简洁,适合快速实现需求。
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

