如何将含不同下划线变量名的宽DataFrame转换为长格式?
处理含多下划线变量名的宽表转长表需求
示例数据
example <- data.frame( date = as.Date(c('2001-01-01', '2001-01-02', '2001-01-01', '2001-01-02')), PID_A = c(1091, 1091, 1037, 1037), PID_B = c(2091, 2091, 2037, 2037), resp_A = c(3,1,2,4), resp_B = c(2,4,3,1), xxx_connect_A = c(6,2,5,3), xxx_connect_B = c(5,3,6,2) )
期望输出
example_solution <- data.frame( date = as.Date(rep(c('2001-01-01', '2001-01-02'),4)), PID = c(1091, 1091, 2091, 2091, 1037, 1037, 2037, 2037), resp = c(3,1,2,4,2,4,3,1), xxx_connect = c(6,2,5,3,5,3,6,2) )
问题分析
原尝试用pivot_longer按下划线分割,但部分变量名含多个下划线(比如xxx_connect_A),导致分割逻辑错误,无法正确提取变量主体和后缀标识(A/B)。
解决方案
使用pivot_longer的names_pattern参数,通过正则表达式匹配最后一个下划线后的后缀,精准区分变量主体和分组标识:
library(tidyr) example |> pivot_longer( -date, names_to = c(".value", "who"), names_pattern = "(.*)_(A|B)$" ) |> select(-who) # 可选:移除不需要的分组标识列,完全匹配期望输出
逻辑解释
names_pattern = "(.*)_(A|B)$":正则表达式规则为:(.*):捕获最后一个下划线前的所有字符,作为变量主体(对应.value,即生成的新列名,如PID、xxx_connect)(A|B):捕获下划线后的A/B标识,对应临时列who
- 执行
select(-who)可移除临时分组列,得到与期望一致的结果。
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

