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

如何用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_idQ1Q2Q3
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:05:21