如何按特定命名模式批量将实验宽格式数据集转为长格式?
宽格式实验数据转长格式(自动匹配多属性变量对)
针对你的实验数据转换需求,这里用tidyverse工具链实现自动匹配条件变量对、批量转换长格式的方案,无需手动指定数百个属性:
核心思路
- 识别所有以
MM7M(条件A)和MMsf7M(条件B)开头的变量 - 通过正则表达式拆分变量名,提取条件标识和属性名称
- 将条件标识替换为直观的
A/B - 把属性名称转成独立列,确保每个被试对应两行数据(分别对应条件A、B)
完整代码
library(tidyverse) # 示例数据 data <- tibble( id = c(1, 2, 3, 4), MM7Mabcde = c(2, 4, 2, 2), MMsf7Mabcde = c(4, 6, 3, 4), MM7Mxyz = c(2, 4, 4, 2), MMsf7Mxyz = c(6, 8, 9, 9), MM7Mtotal_c = c(6, 5, 4, 1), MMsf7Mtotal_c = c(12, 18, 22, 32), someVar = c(5, 6, 9, 9) ) # 执行格式转换 data_long <- data %>% # 选中所有目标变量,拆分变量名为条件和属性 pivot_longer( cols = starts_with("MM7M") | starts_with("MMsf7M"), names_to = c("condition", "attribute"), names_pattern = "(MM7M|MMsf7M)(.*)", values_to = "value" ) %>% # 将条件前缀替换为A/B mutate(condition = case_match(condition, "MM7M" ~ "A", "MMsf7M" ~ "B" )) %>% # 把属性转为独立列,保留非条件变量 pivot_wider( id_cols = c(id, condition, someVar), names_from = attribute, values_from = value ) # 查看转换结果 print(data_long)
代码说明
pivot_longer的names_pattern用正则捕获组,自动拆分变量名的前缀(条件)和后缀(属性),无需手动枚举属性case_match将原始前缀映射为更易读的A/Bpivot_wider将属性维度转成列,最终每个被试对应两行数据,同时保留id、someVar等非条件相关变量
转换后的数据结构示例:
# A tibble: 8 × 6 id condition someVar abcde xyz total_c <dbl> <chr> <dbl> <dbl> <dbl> <dbl> 1 1 A 5 2 2 6 2 1 B 5 4 6 12 3 2 A 6 4 4 5 4 2 B 6 6 8 18 5 3 A 9 2 4 4 6 3 B 9 3 9 22 7 4 A 9 2 2 1 8 4 B 9 4 9 32
内容的提问来源于stack exchange,提问作者Madamadam
相关产品推荐
相关产品推荐

