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

R语言问卷分类变量分组求助:全选1组与其他组划分

在R中实现问卷受访者分组:全选1组 vs 其余组

核心思路

要实现这个分组,核心是逐行检查所有目标问卷条目是否仅选择了1(涵盖单选直接选1、多选只选1的情况),再根据判断结果完成分组。


具体实现步骤

1. 定义目标列

先把需要判断的问卷条目列提取出来,假设你的数据框为df,将目标列名称存入target_cols向量:

target_cols <- c("q1", "q2", "q3", "q4") # 替换成你的实际列名

2. 编写判断函数

针对单选(取值为1/2)和多选(如逗号分隔的"1,2"或列表格式)的不同存储情况,写一个函数判断单个单元格是否仅包含1:

only_one <- function(x) {
  # 处理多选字符格式(如"1"或"1,2")
  if (is.character(x)) {
    selected <- as.integer(strsplit(x, ",")[[1]])
    all(selected == 1)
  } 
  # 处理多选列表格式(如c(1)或c(1,2))
  else if (is.list(x)) {
    all(unlist(x) == 1)
  } 
  # 处理单选格式
  else {
    x == 1
  }
}

3. 逐行判断并分组

这里提供两种常用实现方法:

基础R方法
# 生成每行是否全选1的逻辑值
df$all_one <- apply(df[, target_cols], 1, function(row) {
  all(sapply(row, only_one))
})

# 生成最终分组结果
df$group <- ifelse(df$all_one, "全选1组", "其余组")
dplyr方法(更简洁直观)

如果你习惯用dplyr进行数据处理:

library(dplyr)
library(purrr)

df <- df %>%
  rowwise() %>%
  mutate(
    # 逐行检查所有目标列是否仅选1
    all_one = all(map_lgl(target_cols, ~only_one(!!sym(.x)))),
    # 生成分组
    group = case_when(all_one ~ "全选1组", TRUE ~ "其余组")
  ) %>%
  ungroup()

注意事项

  • 如果你的多选列使用其他分隔符(比如分号),将strsplit(x, ",")替换为对应的分隔符即可。
  • 若数据存在缺失值,需根据实际场景处理:比如在all()中加入na.rm = TRUE,但要先确认缺失值的含义(未作答/无效作答)是否会影响分组逻辑。

内容的提问来源于stack exchange,提问作者komi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:58:29