在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
相关产品推荐
相关产品推荐

