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
相关产品推荐
相关产品推荐

