如何将多列类别变量转换为虚拟变量并统计选项出现次数
问题描述
我有一个包含多个类别的变量,受访者被要求选择他们的前3个选项。此处可选选项为A、B、C和D(实际数据库中可选选项多于4个)。现有数据代码如下:
`var1:choice1` <- c("A","B","C") `var1:choice2` <- c("B","C","A") `var1:choice3` <- c("C","D","B") id=1:3 mydata <- data.frame(id,`var1:choice1`,`var1:choice2`,`var1:choice3`)
希望将这些选项转换为虚拟变量,统计每个选项的出现次数,预期结果如下:
var1.A var1.B var1.C var1.D 1 1 1 1 0 2 0 1 1 1 3 1 1 1 0
方法1:使用tidyverse工具链
通过数据重塑+虚拟变量生成的方式实现,适合处理大规模数据:
library(tidyverse) # 将宽格式数据转为长格式,保留受访者id long_data <- mydata %>% pivot_longer(cols = starts_with("var1:"), names_to = "choice_order", values_to = "option") # 生成虚拟变量并按id汇总 result <- long_data %>% mutate(flag = 1) %>% pivot_wider(names_from = option, values_from = flag, names_prefix = "var1.", values_fill = 0) %>% select(-choice_order) print(result)
方法2:使用base R实现
无需加载额外包,适合轻量数据处理:
# 自动提取所有可选选项(适配实际多选项场景) all_options <- unique(unlist(mydata[, -1])) # 初始化结果矩阵 result_matrix <- matrix(0, nrow = nrow(mydata), ncol = length(all_options)) colnames(result_matrix) <- paste0("var1.", all_options) # 逐行标记受访者选择的选项 for(i in 1:nrow(mydata)){ selected_opts <- mydata[i, -1] result_matrix[i, paste0("var1.", selected_opts)] <- 1 } # 组合id与结果矩阵 result_df <- data.frame(id = mydata$id, result_matrix) print(result_df)
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

