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

R语言pivot_longer中names_pattern正则表达式失效问题排查

用pivot_longer拆分人口普查性别年龄列名

问题背景

处理分性别的人口普查宽表数据,需转为长表获取sex、age_range、count三列。列名格式示例:

  • "Females: Aged 4 years and under [note 12]"
  • "Males: Aged 90 years and over [note 12]"

尝试names_pattern参数未成功,目前通过names_sep结合字符串处理函数实现,希望直接在pivot_longer内完成拆分。

解决方案

核心问题分析

之前的正则匹配失败,主要是分隔符的空格未匹配准确,或未处理列名末尾的注释内容。列名中的固定分隔符是: Aged (冒号后、Aged后均有空格),需在正则中精准对应。

方案1:保留注释的拆分

如果需要保留age_range中的注释内容,使用以下代码:

sex_age_areapiv <- pivot_longer(
  sex_age_area, 
  cols = 4:41,
  names_to = c("sex", "age_range"),
  # 精准匹配分隔符的空格,捕获性别和完整年龄描述(含注释)
  names_pattern = "(.*): Aged (.*)",
  values_to = "count"
)

方案2:移除注释的拆分

若需得到干净的年龄范围(去掉[note xx]注释),使用非贪婪匹配处理:

sex_age_areapiv <- pivot_longer(
  sex_age_area, 
  cols = 4:41,
  names_to = c("sex", "age_range"),
  # 精准匹配性别,非贪婪捕获年龄范围,忽略末尾注释
  names_pattern = "(Females|Males): Aged (.*?)\\s*\\[.*\\]",
  values_to = "count"
)

正则说明

  • (Females|Males):精准匹配性别,避免.*贪婪匹配到多余内容
  • : Aged :严格匹配列名中的固定分隔符(含空格)
  • (.*?):非贪婪匹配年龄范围内容,直到遇到注释前的空格
  • \\s*\\[.*\\]:匹配并忽略末尾的注释部分(空格+[note xx])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:32