如何在R语言中合理拆分调查问卷响应数据
处理多选数据拆分的几种实用方法
针对这类逗号分隔的多选响应数据,下面提供几种简单直接的R语言处理方案:
方法一:使用tidyverse工具链(tidyr + dplyr)
借助tidyverse的函数可以流畅完成长格式与宽格式的转换,同时补全所有选项列:
library(tidyverse) smp <- data.frame( x = c("1,2,3", "2,5,9", "1,5", "2,7,8,9,10") ) # 给每行添加唯一标识,用于后续转宽 smp <- smp %>% mutate(id = row_number()) # 将逗号分隔的字符串拆分成多行 smp_long <- smp %>% separate_rows(x, sep = ",") %>% mutate(x = paste0("d_", x)) # 统一列名格式 # 转换为宽格式,填充未选中的选项为NA result <- smp_long %>% pivot_wider( id_cols = id, names_from = x, values_from = x, values_fn = ~str_remove(.x, "d_"), # 提取数字作为单元格值 values_fill = NA ) %>% select(-id) # 确保包含d_1到d_10的所有列,避免缺失 all_cols <- paste0("d_", 1:10) result <- result %>% select(all_of(all_cols)) print(result)
方法二:使用splitstackshape包快速生成目标格式
splitstackshape包的cSplit_e函数专门针对这类多选项拆分场景,一步生成所有选项列:
library(splitstackshape) smp <- data.frame( x = c("1,2,3", "2,5,9", "1,5", "2,7,8,9,10") ) # 直接生成每个选项的列,未选中填充NA result <- cSplit_e(smp, "x", sep = ",", type = "character", fill = NA, drop = TRUE) # 重命名列并替换值为对应数字 names(result) <- gsub("x_", "d_", names(result)) for(col in names(result)){ num <- str_remove(col, "d_") result[[col]] <- ifelse(!is.na(result[[col]]), num, NA) } print(result)
方法三:Base R原生实现(无需额外包)
如果不想加载第三方包,用基础R代码也可以完成:
smp <- data.frame( x = c("1,2,3", "2,5,9", "1,5", "2,7,8,9,10"), stringsAsFactors = FALSE ) # 定义所有目标选项列 all_options <- 1:10 col_names <- paste0("d_", all_options) # 初始化结果数据框 result <- as.data.frame(matrix(NA, nrow = nrow(smp), ncol = length(all_options))) names(result) <- col_names # 逐行遍历,填充选中的选项值 for(i in 1:nrow(smp)){ selected <- as.integer(strsplit(smp$x[i], ",")[[1]]) for(num in selected){ result[i, paste0("d_", num)] <- num } } print(result)
内容的提问来源于stack exchange,提问作者ryoto
相关产品推荐
相关产品推荐

