如何在R中基于描述变量的连续字符筛选数据框,精准定位初始接球手?
解决方法:用正则精准匹配首个接球野手
1. 精准筛选目标记录
你之前的grepl只匹配了包含", third baseman"的文本,但没限定这个三垒手是在"to"之前的首个接球者。可以调整正则表达式,确保三垒手出现在逗号后、"to"之前:
library(tidyverse) # 筛选三垒手作为首个接球者的记录 DF_filtered <- DF %>% filter(grepl(", third baseman.*to", des))
这里的.*匹配任意非换行字符,确保", third baseman"和"to"是连续关联的,这样就能排除三垒手在"to"之后的无效记录。
2. 提取首个接球手的名字
如果还要直接提取出球员名字(比如Eugenio Suarez),可以用stringr包的str_extract结合正向/反向预查的正则,直接定位名字部分:
DF_processed <- DF %>% filter(grepl(", third baseman.*to", des)) %>% mutate(first_fielder = str_extract(des, "(?<=, third baseman )[A-Za-z]+ [A-Za-z]+(?= to)"))
正则解释:
(?<=, third baseman ):反向预查,确保名字前面是", third baseman "[A-Za-z]+ [A-Za-z]+:匹配名+姓的组合(适配大多数球员名字格式)(?= to):正向预查,确保名字后面跟着" to"
3. 通用适配所有野手位置
如果要处理所有位置(比如一垒手、游击手等),可以把正则里的位置改成通用匹配:
# 匹配任意位置作为首个接球者的记录,并提取名字 DF_all_positions <- DF %>% filter(grepl(", (third|first|second baseman|shortstop|catcher|center fielder|left fielder|right fielder).*to", des)) %>% mutate(first_fielder = str_extract(des, "(?<=, (third|first|second baseman|shortstop|catcher|center fielder|left fielder|right fielder) )[A-Za-z]+ [A-Za-z]+(?= to)"))
这样就能覆盖棒球里常见的野手位置,精准提取每个记录里的首个接球者。
内容的提问来源于stack exchange,提问作者stevoo_p13
相关产品推荐
相关产品推荐

