2017-07-19 59 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不會將匹配的文本添加到匹配中(它們是非消耗的)。