2016-11-21 1 views
2

私は正規表現のリストとして325kの一意の観測値を持つかなり大きなベクトル( 'table')を持っています。 )の26k観測非常に大きな正規表現のベクターでgrepを使用する

「テーブル」と正規表現の結果のリストが3000個未満の場合はうまくいく(私の推測では文字数であり、重要な穴のような表現ではない)このコードを使用しています:

matches <- unique(grep(paste(table, 
          collapse="|"), 
         data$ID, 
         perl = TRUE, 
         value=FALSE)) 

しかし、「テーブル」と正規表現の結果リストは、もはやこれ以上であれば、私はエラーが出る「PCREのパターンのコンパイル・エラー - 『正規表現が大きすぎる』を

観測私は文字列パターンの混合袋を持って検索したいsu chは「xxx-yyyy」、「L-cc-fff-C12Z3N-xxx」、さらには「Name.xxx-12N7t-p6」などとなります。このため、私の325kベクトルの正規表現の1つに一致する文字列の部分を解析し、match()を使用して正規表現を使用したいという私の望みをすべて解析するのは現実的ではありません。

私の 'table'を3000+サブセットに分割し、上記のコードを使用するのが最善の方法はありませんか?

Rバージョン3.2.3(2015年12月10日) - "木のクリスマスツリー" 著作権(C)2015統計コンピューティング プラットフォームのためのR財団:x86_64版-W64-MINGW32/x64(64ビット) R-Studioバージョン0.98.1028

ご協力いただきありがとうございます。

+2

正規表現が本当に必要ですか?または、正確に一致する部分文字列を探しているだけですか?または文字列全体が一致しますか?検索文字列の一部を表示できますか? – Gregor

+1

仕事をやらなければならない場合は、1つを強制しようとするのではなく、いくつかの検索に分割することができます –

+0

別の正規表現ライブラリを使用する 'stringr' /' stringi'を使用し、PCRE〜65kの長さ制限 – eddi

答えて

0

applyループ内の各正規表現文字列を1つずつ確認できます。これは少し遅くなりますが、スピードが重要でない場合には、satidfactoryソリューションを提供します:

matches = unique(unlist(lapply(mytable, grep, x=mydata$id, value=F))). 

いくつかの再現性の上でこれをテストするためのデータ:ところで

mydata = data.frame(id = paste0(sample(letters, 30000, T), 
           sample(letters, 30000, T), 
           sample(letters, 30000, T), 
           sample(letters, 30000, T))) 

mytable = paste0(sample(letters, 30000, T), 
       sample(letters, 30000, T), 
       sample(letters, 30000, T), 
       sample(letters, 30000, T)) 

datatableされていますどちらもRの予約語なので、これらを変数名として使用するのは賢明ではありません。したがって私は代わりにmytablemydataと呼んだ。

関連する問題