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

如何用tidyr::separate_wider_regex拆分含可选年份的赛事字段

使用tidyr::separate_wider_regex拆分赛事名称与可选年份

问题场景

有一个包含体育赛事的DataFrame,赛事名称后可能带有格式多样的可选年份(无空格或单词数量限制),示例数据如下:

library(tibble)
df <- tibble(event_optional_year = c("World Championships", "Summer Olympics 12", "Olympics 2016", "Olympics 2020/2021"))

需要将event_optional_year列拆分为event(去除可选年份的赛事名称)和year(对应年份或NA)两列。

正确实现代码

使用tidyr::separate_wider_regex搭配特定正则表达式即可完成拆分:

library(tidyr)

df_split <- df %>%
  separate_wider_regex(
    event_optional_year,
    patterns = list(
      event = "^(.+?)(?=\\s+[0-9/]+$|$)",
      year = "(?:\\s+([0-9/]+))?$"
    )
  )

正则逻辑解释

  • event列正则:^(.+?)(?=\\s+[0-9/]+$|$)

    • ^ 锁定字符串起始位置
    • (.+?) 非贪婪捕获赛事名称主体(尽可能少匹配,避免吞掉年份前的内容)
    • (?=...) 正向预查,确保捕获的内容后要么是「空格+数字/斜杠组合到结尾」,要么直接到字符串结尾(对应无年份的情况)
  • year列正则:(?:\\s+([0-9/]+))?$

    • (?:...) 非捕获组,用来包裹可选的年份前缀和内容
    • \\s+ 匹配年份前的一个或多个空格
    • ([0-9/]+) 捕获由数字、斜杠组成的年份内容(支持两位年份、四位年份、年份范围格式)
    • ?$ 表示整个年份模块是可选的,适配无年份的条目

拆分结果

执行代码后得到的结果如下:

#> # A tibble: 4 × 2
#>   event               year      
#>   <chr>               <chr>     
#> 1 World Championships <NA>      
#> 2 Summer Olympics     12        
#> 3 Olympics            2016      
#> 4 Olympics            2020/2021

扩展说明

如果年份格式包含其他特殊字符(比如短横线-),只需调整正则中的字符集,例如将[0-9/]+改为[0-9/-]+即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:52:52