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

