2017-07-03 13 views
1

私は、複数のパターンを含むベクトルとdata.tableの値を照合しようとしています。私が持っているデモ・コードは次のとおりです。効率的な方法パターンのベクトルとの正規表現の一致

正しく返し
library(data.table) 

sites <- c("www.google.com", "plus.google.com", "www.yahoo.com", "www.bbc.co.uk") 
patterns <- c("bb", "goog") 
x <- data.table(sites) 

# Regexp version of the in operator, iterates over a group 
`%match_in%` <- function (values, match_list) { 
    sapply(values, 
     function (x, ml) { 
      any(sapply(ml, grepl, x, ignore.case=TRUE, perl=TRUE)) 
     } 
     ,match_list 
)} 

x[sites %match_in% patterns] 

:これは、ネストされたsapplyが含まれているため

   sites 
1: www.google.com 
2: plus.google.com 
3: www.bbc.co.uk 

をしかし、大きなdata.tablesで実行することは非常に遅いです。

これを行うより効率的な方法がありますが、これは大きなテーブルでも使用できますか?

+0

NOTEを固執する:実際のコードでは、 'patterns'は、数百個のアイテムを持っており、正規表現は、物事を含み見た目のようなものなので、それらを1行に入れることは実用的ではありません。 – Iain

答えて

3

複数のパターンを検索している場合は、パターンをorという構文で組み合わせないでください。 @Mariusが示唆しているように、確認するパターンがたくさんある場合はpaste0(patterns, collapse = "|")を使用して作成できます。例えば

all_patterns = paste0(patterns, collapse = "|") 

stringr::str_subset(sites, all_patterns) 
[1] "www.google.com" "plus.google.com" "www.bbc.co.uk" 

おそらく、あなたのdata.tableユースケースで

x[stringr::str_detect(sites, all_patterns)] 
      sites 
1: www.google.com 
2: plus.google.com 
3: www.bbc.co.uk 
+0

'paste0(patterns、collapse =" | ")'多数のパターンがあるときに正規表現を作成します。 – Marius

+0

私の明確化を参照してください - 1行に入れると実行できませんが、paste0の可能性があります – Iain

+0

パターンを1つの大きなパターンに崩壊させるのがパターンのリストを反復するよりも速くても遅くてもよいでしょう。 – thc

関連する問題