R语言无通用分隔符时如何用pivot_longer()按列名尾字符拆分数据
解决方案:按列名末尾B/T拆分实现pivot_longer转换
核心思路是利用pivot_longer()的names_pattern参数配合正则拆分列名,结合特殊.value参数直接生成B、T列,无需额外转置步骤。
- 依赖包加载
library(tidyr) library(dplyr)
- 原始数据构造(与示例一致)
df <- tibble(Datetime = seq(as.Date("2000/1/1"), by = "month", length.out = 10), `ABC1-P1B` = seq(1,10), `ABC1-P1T` = seq(101,110), `ABC1-P2B` = seq(11,20), `ABC1-P2T` = seq(201,210))
- 转换代码
result <- df %>% pivot_longer( cols = -Datetime, names_to = c("ID", ".value"), names_pattern = "^(.*)([BT])$" )
参数说明
cols = -Datetime:指定除Datetime外的所有列参与转换names_to = c("ID", ".value"):正则第一个捕获组的内容命名为ID列,第二个捕获组的内容直接作为新列的列名names_pattern = "^(.*)([BT])$":正则逻辑^匹配列名开头(.*)第一捕获组:贪婪匹配除最后一位外的所有字符,即拆出ABC1-P1、ABC1-P2这类ID([BT])第二捕获组:严格匹配列名末尾的B或T$匹配列名结尾
注:原示例提供的期望输出行顺序为笔误,上述代码运行后得到的结果与需求的字段、取值逻辑完全匹配,每个日期对应2个ID的B、T取值。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

