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

在R中匹配首个下划线的正则表达式:pivot_longer列名拆分需求

解决tidyr::pivot_longer按首个下划线分割列名的问题

示例数据

先构造符合需求的宽格式DataFrame:

library(tidyr)

df <- tibble(
  H198_text = c(1, 2, 3),
  K177_test = c(4, 5, 6),
  P100_find_g9 = c(7, 8, 9)
)

方案1:用names_pattern(推荐,逻辑更清晰)

通过正则捕获组直接指定分割后的两部分内容,对应Item和Attribute列:

df_long <- df %>%
  pivot_longer(
    cols = everything(),
    names_pattern = "^([^_]+)_(.*)",
    names_to = c("Item", "Attribute"),
    values_to = "Value"
  )

正则说明:

  • ^([^_]+):捕获从开头到第一个下划线前的所有非下划线字符(即H198、K177这类内容)
  • _(.*):捕获第一个下划线之后的所有字符(即text、find_g9这类属性内容)

方案2:用names_sep匹配首个下划线

如果一定要用names_sep参数,可通过正向预查正则定位第一个下划线:

df_long <- df %>%
  pivot_longer(
    cols = everything(),
    names_sep = "(?<=^[^_])_",
    names_to = c("Item", "Attribute"),
    values_to = "Value"
  )

正则说明:

  • (?<=^[^_]):正向预查确保下划线前是「从开头到第一个非下划线字符」的内容
  • _:仅匹配满足条件的第一个下划线

为什么之前的写法可能失败?

如果用.*?_这类懒匹配,容易在复杂列名中出现匹配偏差;而[^_]+是贪婪匹配所有非下划线字符,能精准停在第一个下划线位置,避免过度匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:25:17