如何用tidyr::pivot_longer一次性完成多列宽转长数据整理
解决方案
你可以借助pivot_longer的names_pattern参数配合正则匹配,一次性完成宽表转长表的操作,无需拆分多个子表再合并,示例代码如下:
library(tidyverse) # 替换下面的「raw_data」为你的实际数据框名称 final_long <- raw_data %>% # 筛选需要处理的列,自动过滤will_ef、dexfood等不需要的列 select(ID, matches("^will_f\\d+$|^dface\\d+$|^dfood\\d+$|^dout\\d+$")) %>% pivot_longer( cols = -ID, # .value表示第一组正则匹配结果作为新列名,第二组作为trial列取值 names_to = c(".value", "trial"), # 正则分两组:第一组抓变量前缀,第二组抓末尾的试验编号 names_pattern = "(will_f|dface|dfood|dout)(\\d+)", # 转换前缀为你需要的变量名,同时把trial转为整数格式 names_transform = list( .value = ~case_when( .x == "will_f" ~ "will", .x == "dface" ~ "face", .x == "dfood" ~ "food", .x == "dout" ~ "out" ), trial = as.integer ) )
核心逻辑说明
- 用
matches()配合正则筛选目标列,避免手动指定列范围出错 names_to中的.value是pivot_longer的特殊关键字,会把对应正则分组匹配到的内容转为新的变量列,自动按ID和trial对齐取值names_transform一步完成前缀重命名和trial的类型转换,无需额外处理
运行后你将直接得到包含ID、trial、will、face、food、out六列的长表,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者gundedun
相关产品推荐
相关产品推荐

