在R中基于多规则拆分无简单分隔符的字符串
解决方案
可以用tidyverse里的stringr和tidyr工具组合实现,步骤如下:
假设你的原始数据是一个单列的data.frame/tibble,列名为raw_data,先模拟示例数据:
library(tidyverse) # 模拟原始单列数据 df <- tibble(raw_data = "Jacoby BrissettO 206.5-115U 206.5-115Joe BurrowO 243.5-115U 243.5-155")
步骤1:拆分每个球员的独立信息块
利用球员名字首字母大写的规律,用正则正向预查定位分割点,把长字符串拆成单个球员的信息片段:
df_split <- df %>% mutate(player_blocks = str_split(raw_data, "(?=[A-Z][a-z]+)")) %>% unnest(player_blocks)
这里的正则(?=[A-Z][a-z]+)是正向预查,匹配"后面跟着大写字母+小写字母"的位置——刚好对应新球员名字的开头,以此分割出每个球员的完整信息块。
步骤2:提取名字和O/U线数值
对每个球员块,分别提取目标字段:
result <- df_split %>% # 提取名字:匹配到"O"之前的所有内容 mutate(Name = str_extract(player_blocks, "^.*?(?=O)"), # 提取O线数值:匹配"O "后面的浮点数 `O/U Line` = str_extract(player_blocks, "(?<=O )\\d+\\.\\d")) %>% # 过滤空行(防止分割出无效片段) filter(!is.na(Name) & !is.na(`O/U Line`)) %>% select(Name, `O/U Line`)
运行后得到的result就是你需要的表格:
| Name | O/U Line |
|---|---|
| Jacoby Brissett | 206.5 |
| Joe Burrow | 243.5 |
关键正则说明
^.*?(?=O):从字符串开头匹配,直到遇到"O"为止(不包含O),非贪婪模式避免匹配过多内容。(?<=O )\\d+\\.\\d:正向后顾匹配"O ",提取后面的浮点数,确保取的是O对应的数值而非U的。
内容的提问来源于stack exchange,提问作者mankiwsmom
相关产品推荐
相关产品推荐

