如何用R将多行列参与者问卷数据转换为宽格式(一行一人)
将长格式调查数据转换为宽格式(R实现)
你提到的group_by()其实不是完成这个任务的核心函数,tidyverse生态里的tidyr::pivot_wider()才是专门用来把长格式数据转成宽格式的工具,配合dplyr的管道操作就能轻松实现需求。
步骤1:加载必要的包
首先确保你安装了tidyverse(包含dplyr和tidyr),如果没安装先运行install.packages("tidyverse"),然后加载:
library(tidyverse)
步骤2:准备示例数据
假设你的长格式数据结构如下(和实际数据结构对应):
# 模拟长格式调查数据 survey_long <- tibble( participant_id = c(1, 1, 1, 2, 2, 2), # 参与者唯一ID question = c("Q1", "Q2", "Q3", "Q1", "Q2", "Q3"), # 问题标识 answer = c("同意", "不同意", "中立", "不同意", "同意", "同意") # 对应答案 )
步骤3:转换为宽格式
使用pivot_wider()一键转换,参数说明如下:
id_cols: 指定作为每行唯一标识的列(这里是参与者ID)names_from: 指定要转为新列名的列(这里是问题)values_from: 指定对应新列值的来源列(这里是答案)
代码:
survey_wide <- survey_long %>% pivot_wider( id_cols = participant_id, names_from = question, values_from = answer )
运行后得到的宽格式数据结构如下:
| participant_id | Q1 | Q2 | Q3 |
|---|---|---|---|
| 1 | 同意 | 不同意 | 中立 |
| 2 | 不同意 | 同意 | 同意 |
特殊情况处理:同一参与者同一问题有多个答案
如果数据里存在同一个参与者对同一问题多次回答的情况,可以用values_fn参数指定处理逻辑,比如取第一个答案,或者合并所有答案:
# 模拟存在重复回答的长格式数据 survey_long_dup <- tibble( participant_id = c(1, 1, 1, 1), question = c("Q1", "Q1", "Q2", "Q3"), answer = c("同意", "中立", "不同意", "中立") ) # 取第一个回答 survey_wide_first <- survey_long_dup %>% pivot_wider( id_cols = participant_id, names_from = question, values_from = answer, values_fn = first ) # 合并所有回答(用分号分隔) survey_wide_merge <- survey_long_dup %>% pivot_wider( id_cols = participant_id, names_from = question, values_from = answer, values_fn = ~paste(., collapse = "; ") )
内容的提问来源于stack exchange,提问作者user20223164
相关产品推荐
相关产品推荐

