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

