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

如何用R将问卷宽格式Dataframe重组为指定长格式?

在R中将问卷宽格式数据转为长格式

你可以用tidyverse工具包的pivot_longer和pivot_wider组合实现这个转换,步骤如下:

1. 构造示例数据(模拟你的问卷数据)

library(tidyverse)

df_wide <- tibble(
  `问题1.a` = c("Yes", "Yes"),
  `问题1.b` = c("No Danger", "Danger"),
  `问题2.a` = c("No", "Yes"),
  `问题2.b` = c("Danger", "Danger")
)

2. 数据转换代码

df_long <- df_wide %>%
  # 添加样本ID,确保每个受访者的a/b回答对应关系
  mutate(样本ID = row_number()) %>%
  # 将所有列转为长格式,拆分列名为问题编号和a/b部分
  pivot_longer(
    cols = -样本ID,
    names_to = c("问题", "Part"),
    # 正则表达式匹配列名结构:"问题X.a" → 捕获X和a
    names_pattern = "问题(\\d+)\\.(a|b)",
    values_to = "回答"
  ) %>%
  # 将a/b部分转为两列
  pivot_wider(
    id_cols = c(样本ID, 问题),
    names_from = Part,
    names_prefix = "Part ",
    values_from = 回答
  ) %>%
  # 移除样本ID并按问题排序
  select(-样本ID) %>%
  arrange(问题)

运行后得到的df_long就是你需要的长格式:

# A tibble: 4 × 3
  问题  `Part a` `Part b`  
  <chr> <chr>    <chr>     
1 1     Yes      No Danger
2 1     Yes      Danger    
3 2     No       Danger    
4 2     Yes      Danger    

关键说明

  • names_pattern的正则表达式"问题(\\d+)\\.(a|b)"是核心,它会从列名中提取问题编号和a/b部分;如果你的列名是英文格式(比如Q1.a),只需要把正则改成"Q(\\d+)\\.(a|b)"即可。
  • 添加样本ID是为了保证每个受访者的.a和.b回答不会错位,转换完成后可以根据需要保留或删除。

内容的提问来源于stack exchange,提问作者Coline Andriès

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:02:28