You need to enable JavaScript to run this app. R语言无通用分隔符时如何用pivot_longer()按列名尾字符拆分数据
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 12:27:06