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

