在R语言中从多格式文本提取NFL达阵球员姓名的方法求助
在R语言中从格式多样的
play_desc列提取NFL达阵球员姓名 问题场景
需要从格式不一的NFL比赛描述文本(play_desc列)中提取达阵得分球员姓名,示例文本及目标结果如下:
play_1 <- "Kareem Hunt Pass From Jacoby Brissett for 1 Yd C.York extra point is GOOD, Center-C.Hughlett, Holder-C.Bojorquez." play_2 <- "(10:03) J.Allen pass short right to G.Davis for 26 yards, TOUCHDOWN.T.Bass extra point is GOOD, Center-R.Ferguson, Holder-S.Martin." play_3 <- "Michael Thomas 9 Yd pass from Jameis Winston (Two-Point Run Conversion Failed)" play_4 <- "(12:58) K.Murray pass short left to M.Brown for 6 yards, TOUCHDOWN. TWO-POINT CONVERSION ATTEMPT. K.Murray pass to Z.Ertz is complete. ATTEMPT SUCCEEDS." play_5 <- "DJ Chark Pass From Jared Goff for 22 Yds A.Seibert extra point is GOOD, Center-S.Daly, Holder-J.Fox." play_6 <- "(3:24) P.Mahomes pass short middle to C.Edwards-Helaire for 3 yards, TOUCHDOWN.J.Reid extra point is GOOD, Center-J.Winchester, Holder-T.Townsend." play_7 <- "Isaiah McKenzie Pass From Josh Allen for 7 Yds T.Bass extra point is GOOD, Center-R.Ferguson, Holder-S.Martin."
对应目标球员:Kareem Hunt、G.Davis、Michael Thomas、M.Brown、DJ Chark、C.Edwards-Helaire、Isaiah McKenzie
解决方案
观察文本规律,达阵球员的位置分为两种典型句式,可通过正则表达式匹配两种场景来提取,结合stringr包实现:
核心代码
library(dplyr) library(stringr) # 构造示例数据框 plays_df <- tibble( play_desc = c(play_1, play_2, play_3, play_4, play_5, play_6, play_7), play_type = rep("Passing Touchdown", 7) ) # 提取达阵球员 plays_df <- plays_df %>% mutate(td_scorer = case_when( play_type == "Passing Touchdown" ~ str_trim(str_extract(play_desc, "^[^(]*?(?=( Pass| \\d+ Yd))|(?<=to )[^ ]+?(?= for |, TOUCHDOWN)" )) ))
正则逻辑解释
正则分为两个备选分支,分别对应两种句式:
^[^(]*?(?=( Pass| \\d+ Yd)):匹配文本开头到Pass或数字 Yd之前的内容,对应「达阵球员在文本开头」的场景(如play_1、3、5、7)(?<=to )[^ ]+?(?= for |, TOUCHDOWN):匹配to之后、for或, TOUCHDOWN之前的内容,对应「达阵球员在传球者之后的to引导语后」的场景(如play_2、4、6)
验证结果
运行代码后,td_scorer列会得到预期的达阵球员姓名:
# A tibble: 7 × 3 play_desc play_type td_scorer <chr> <chr> <chr> 1 Kareem Hunt Pass From Jacoby Brissett for 1 Yd C.York extra point is GOOD… Passing Touchdown Kareem Hunt 2 (10:03) J.Allen pass short right to G.Davis for 26 yards, TOUCHDOWN.T.Bas… Passing Touchdown G.Davis 3 Michael Thomas 9 Yd pass from Jameis Winston (Two-Point Run Conversion Fa… Passing Touchdown Michael Thomas 4 (12:58) K.Murray pass short left to M.Brown for 6 yards, TOUCHDOWN. TWO-P… Passing Touchdown M.Brown 5 DJ Chark Pass From Jared Goff for 22 Yds A.Seibert extra point is GOOD, C… Passing Touchdown DJ Chark 6 (3:24) P.Mahomes pass short middle to C.Edwards-Helaire for 3 yards, TOUC… Passing Touchdown C.Edwards-Helaire 7 Isaiah McKenzie Pass From Josh Allen for 7 Yds T.Bass extra point is GOOD… Passing Touchdown Isaiah McKenzie
内容的提问来源于stack exchange,提问作者Sam Hoppen
相关产品推荐
相关产品推荐

