2017-07-19 52 views
1

我有一个包含市场名称和其他的东西比赛从所有可能的子

S = c('123_GOLD_534', '531_SILVER_dfds', '93_COPPER_29dad', '452_GOLD_deww') 

和另一个向量串长向量的另一份名单串包含了所有可能的市场

V = c('GOLD','SILVER') 

哪有我从S中提取市场名称?基本上我想循环过VS,用V[i]代替S[j],如果是grepl(V[i], S[j])

所以结果应该

c('GOLD','SILVER',NA,'GOLD') 

回答

3

您可以使用str_extract从stringr:

> library(stringr) 
> str_extract(S, paste(V, collapse="|")) 
[1] "GOLD" "SILVER" NA  "GOLD" 

paste(V, collapse="|")将创建像GOLD|SILVER一个正则表达式,从而将提取GOLDSILVER。如果正则表达式不匹配,它只会返回NA。

请注意,如果你需要匹配GOLDSILVER只有当_符号中,取代paste(V, collapse="|")paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)")

> str_extract(S, paste0("(?<=_)(?:", paste(V, collapse="|"), ")(?=_)")) 
[1] "GOLD" "SILVER" NA  "GOLD" 

这将创建一个正则表达式像(?<=_)(?:GOLD|SILVER)(?=_),将只匹配GOLDSILVER如果有在前面的_(?<=_),正向后视),并且如果在值之后有_(由于(?=_)积极向前看)。 Lookaheads不会将匹配的文本添加到匹配中(它们是非消耗的)。