You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tidyr中pivot_longer多嵌套列名的names_pattern设置问题

解决pivot_longer转换宽表为长表的正则分组问题

错误原因

你使用的正则[a-zA-Z_]+没有定义捕获分组,但names_to = c("FaultID", "FaultYear")要求正则必须匹配出2个分组,因此触发报错。这个正则仅能匹配字母和下划线组成的字符串,完全没有对应目标列的拆分逻辑。

正确实现方案

根据你的列名规则(A_Q_<指标名>_C_<数字>),我们需要从列名中提取指标名(如FaultID/FaultYear)和序号,再将指标名转为长格式的列。使用tidyr的pivot_longer配合.value参数可以直接实现:

library(tidyr)
library(dplyr)

df_long <- df %>%
  pivot_longer(
    cols = starts_with("A_Q_"), # 通用匹配所有待转换列,代替固定列索引3:8
    names_to = c(".value", "Index"), # .value表示将捕获的第一组作为新列名
    names_pattern = "A_Q_(.*)_C_(\\d+)" # 两个捕获组:指标名、序号
  ) %>%
  select(-Index) # 不需要序号列时可删除此行

正则说明

names_pattern = "A_Q_(.*)_C_(\\d+)"的两个捕获组:

  • (.*):捕获A_Q_之后、_C_之前的内容,即FaultID或FaultYear,.value会自动将这部分转为长表的列名;
  • (\\d+):捕获_C_之后的数字序号,对应临时的Index列,用于标识同一组的指标。

运行后得到的df_long结构与你目标的长格式完全一致。

内容的提问来源于stack exchange,提问作者Dee G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:40:09