如何使用tidyr::pivot_longer()整理多组关联列?
问题描述
我需要将数据框中的两组列整理为新的列,同时保留行数据的关联结构。多次使用tidyr::gather()无法维持这种列间关联,tidyr::pivot_longer()看似能满足需求,但我在参数设置上遇到了障碍。此前见过类似问题的解决方案,但用到了grep重命名列,我无法理解,而且这里应该不需要额外重命名操作。
示例数据:
library(tidyverse) df <- data.frame( Position=1:5, A_Width=3:7, B_Width=4:8, A_Error=seq(0, 2.0, 0.5), B_Error=seq(0.3, 1.5, 0.3) )
期望得到的长格式数据框:
df_long <- data.frame( Position=rep(1:5,2), Group=c(rep("A",5), rep("B",5)), Width=c(3:7,4:8), Error=c(seq(0, 2.0, 0.5), seq(0.3, 1.5, 0.3)) )
解决方案
使用tidyr::pivot_longer()的多组捕获功能,通过正则表达式拆分列名,直接生成目标结构:
df_long <- df %>% tidyr::pivot_longer( cols = -Position, # 排除不需要转换的Position列 names_to = c("Group", ".value"), # 拆分列名为分组和指标列名 names_pattern = "(.*)_(.*)" # 正则捕获下划线前后的分组与指标 )
参数解释
cols = -Position:指定除Position外的所有列参与转换,比手动罗列列更简洁names_to = c("Group", ".value"):Group:存储从列名中提取的分组标识(A/B).value:特殊关键字,代表这部分对应新的列名(Width/Error),原始列的值会填充到对应列中
names_pattern = "(.*)_(.*)":正则表达式的两个捕获组,分别匹配下划线分隔的两部分内容,完美适配你列名的命名规则
运行后得到的结果与你期望的df_long完全一致。
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

