如何在R语言中合并同一数据框内列名相似的多列
R语言多选问卷数据处理方案
一、判断每行是否作答QUESTION1
你之前用unite拼接字符串的方式不符合需求,正确的做法是判断每行中任意一个QUESTION1相关列是否非NA,以此标记该用户是否已作答这个多选问题。用starts_with("QUESTION1")可以批量匹配列名,不用手动指定列位置,适合大型数据集:
library(tidyverse) # 先把矩阵转成数据框,并将QUESTION1列转为整数类型(原数据是字符矩阵,处理更方便) dat <- as.data.frame(dat) %>% mutate(across(starts_with("QUESTION1"), ~ as.integer(.))) # 添加是否作答的标记列:TRUE=已作答,FALSE=未作答 dat <- dat %>% mutate(QUESTION1_answered = if_any(starts_with("QUESTION1"), ~ !is.na(.)))
运行后QUESTION1_answered列会直接标记每行是否完成该问题的作答,比拼接字符串更直观。
二、单个选项的分析方法
如果要分析每个选项的选择情况(比如选中率、不同群体的差异),可以用以下几种方式:
1. 统计各选项的整体选中率
假设1代表选中该选项,0代表未选,NA代表未作答:
# 计算每个选项的选中占比(百分比) option_overview <- dat %>% summarise(across(starts_with("QUESTION1"), ~ sum(. == 1, na.rm = TRUE)/nrow(dat) * 100))
2. 按分组(如性别)统计选项差异
# 按性别分组,统计各选项的选中率 gender_option_stats <- dat %>% group_by(gender) %>% summarise(across(starts_with("QUESTION1"), ~ sum(. == 1, na.rm = TRUE)/n() * 100))
3. 转成长格式进行灵活分析
把宽格式的选项列转成长格式后,能更方便地做交叉分析、可视化:
# 转成长格式,只保留已作答的记录 dat_long <- dat %>% pivot_longer(starts_with("QUESTION1"), names_to = "option", values_to = "selected") %>% filter(!is.na(selected)) # 统计每个选项的选中/未选次数 option_counts <- dat_long %>% count(option, selected)
三、学习资源指引
- 基础批量列处理:查看dplyr包的内置文档,输入
?dplyr::across或vignette("dplyr"),里面详细讲解了across、if_any这类批量操作函数的用法。 - 问卷数据专用工具:
questionr包提供了很多问卷分析的实用函数(比如交叉表、频数统计),安装后输入?questionr查看文档。 - 多选问题进阶分析:如果需要研究选项间的关联或做可视化,可以结合
ggplot2包,用长格式数据绘制柱状图、热力图等。
内容的提问来源于stack exchange,提问作者Lynne
相关产品推荐
相关产品推荐

