You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:28