繁体   English   中英

在字符串后提取第 n 次出现

[英]extracting nth occurrence after string

有一列看起来像这样

test <- c("QB Deshaun Watson RB Alvin Kamara FLEX Chris Carson RB Jamaal Williams WR Davante Adams WR Brandin Cooks WR Christian Kirk TE Darren Fells DST Browns", "QB Kyler Murray RB Alvin Kamara FLEX Chris Carson RB Jamaal Williams WR DeAndre Hopkins WR Terry McLaurin WR Marvin Jones Jr. TE David Njoku DST Saints","RB Alvin Kamara FLEX Giovani Bernard RB Jamaal Williams WR Stefon Diggs WR Keenan Allen DST Titans QB Derek Carr WR Chris Godwin TE Darren Waller")

我想在每一行中提取“RB”的第二个实例之后的名称。

为了获得第一场比赛,我正在使用

str_extract(test, "RB\\\\W+\\\\S+\\\\W+\\\\S+")

返回

[1] "RB Alvin Kamara" "RB Alvin Kamara" "RB Alvin Kamara"

这适用于第一场比赛,但我也想要第二场(只有第二场)。 非常感谢任何帮助!

str_extract_all(test, "RB\\W+\\S+\\W+\\S+")

将返回所有匹配项的列表。 如果你只想要第二个,你可以使用

str_extract_all(test, "RB\\W+\\S+\\W+\\S+") %>% map(~.[[2]])

类似的,base-R:

gre <- gregexpr("RB\\s*(\\S+(\\s?\\S*))", test)
regmatches(test, gre)
# [[1]]
# [1] "RB Alvin Kamara"    "RB Jamaal Williams"
# [[2]]
# [1] "RB Alvin Kamara"    "RB Jamaal Williams"
# [[3]]
# [1] "RB Alvin Kamara"    "RB Jamaal Williams"

从这里,您可以使用sapply(...)获得第二个,如

sapply(regmatches(test, gre), `[[`, 2)
# [1] "RB Jamaal Williams" "RB Jamaal Williams" "RB Jamaal Williams"

顺便说一句,如果您打算以编程方式执行此操作而不仅仅是“第二个 RB”,那么这里有一个更通用的拆分字符串的解决方案:

gre <- gregexpr("\\b[A-Z][A-Z]+\\b", test)
pos <- regmatches(test, gre, invert=FALSE)
str(pos)
# List of 3
#  $ : chr [1:9] "QB" "RB" "FLEX" "RB" ...
#  $ : chr [1:9] "QB" "RB" "FLEX" "RB" ...
#  $ : chr [1:9] "RB" "FLEX" "RB" "WR" ...
name <- regmatches(test, gre, invert=TRUE)
str(name)
# List of 3
#  $ : chr [1:10] "" " Deshaun Watson " " Alvin Kamara " " Chris Carson " ...
#  $ : chr [1:10] "" " Kyler Murray " " Alvin Kamara " " Chris Carson " ...
#  $ : chr [1:10] "" " Alvin Kamara " " Giovani Bernard " " Jamaal Williams " ...

请注意name向量如何都具有前面的"" ; 因为我们知道我们只关心位置后面的名称,所以我们可以省略它,然后将所有内容粘贴在一起:

Map(paste, lapply(pos, trimws), lapply(name, function(a) trimws(a[-1])))
# [[1]]
# [1] "QB Deshaun Watson"  "RB Alvin Kamara"    "FLEX Chris Carson"  "RB Jamaal Williams" "WR Davante Adams"  
# [6] "WR Brandin Cooks"   "WR Christian Kirk"  "TE Darren Fells"    "DST Browns"        
# [[2]]
# [1] "QB Kyler Murray"     "RB Alvin Kamara"     "FLEX Chris Carson"   "RB Jamaal Williams"  "WR DeAndre Hopkins" 
# [6] "WR Terry McLaurin"   "WR Marvin Jones Jr." "TE David Njoku"      "DST Saints"         
# [[3]]
# [1] "RB Alvin Kamara"      "FLEX Giovani Bernard" "RB Jamaal Williams"   "WR Stefon Diggs"      "WR Keenan Allen"     
# [6] "DST Titans"           "QB Derek Carr"        "WR Chris Godwin"      "TE Darren Waller"        

(这对trimws使用相当自由,可以在之后处理,但这是对空白的更外科手术/特定提取。)

既然你想要第n,这里还有一点。

data.frame(
  ind = rep(seq_along(test), times = lengths(pos)),
  nth = unlist(lapply(pos, function(z) 1 + ave(duplicated(z), z, FUN = cumsum))),
  pos = unlist(lapply(pos, trimws)),
  name = unlist(lapply(lapply(name, `[`, -1), trimws))
)
#    ind nth  pos             name
# 1    1   1   QB   Deshaun Watson
# 2    1   1   RB     Alvin Kamara
# 3    1   1 FLEX     Chris Carson
# 4    1   2   RB  Jamaal Williams
# 5    1   1   WR    Davante Adams
# 6    1   2   WR    Brandin Cooks
# 7    1   3   WR   Christian Kirk
# 8    1   1   TE     Darren Fells
# 9    1   1  DST           Browns
# 10   2   1   QB     Kyler Murray
# 11   2   1   RB     Alvin Kamara
# 12   2   1 FLEX     Chris Carson
# 13   2   2   RB  Jamaal Williams
# 14   2   1   WR  DeAndre Hopkins
# 15   2   2   WR   Terry McLaurin
# 16   2   3   WR Marvin Jones Jr.
# 17   2   1   TE      David Njoku
# 18   2   1  DST           Saints
# 19   3   1   RB     Alvin Kamara
# 20   3   1 FLEX  Giovani Bernard
# 21   3   2   RB  Jamaal Williams
# 22   3   1   WR     Stefon Diggs
# 23   3   2   WR     Keenan Allen
# 24   3   1  DST           Titans
# 25   3   1   QB       Derek Carr
# 26   3   3   WR     Chris Godwin
# 27   3   1   TE    Darren Waller

您可以简单地过滤nthpos

(这突出了这样一个事实,即"Marvin Jones Jr."将破坏任何依赖于名字/姓氏配对的正则表达式。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM