2017-02-05 19 views
0

文字列のリストからデータフレームへの部分一致を行うのに問題があります。R部分一致文字列

私のDFは、この構造を有する:

> df 
    mrun          address stat 
8988741 cerro pedregal 8536 , Antofagasta, Antofagasta OK 
17625851    rancagua 2777 , Iquique, Tarapacá OK 
9423953    picarte 4100 , Valdivia, Los Ríos OK 
3459140   balmaceda 935 , Temuco, La Araucanía OK 
24507700    rancagua 1940, La Serena, Coquimbo OK 

と私は、この値を持つ文字列のリストを持っている:

> address_list 
c("balmaceda", "rancagua", "bombero garrido") 

私は、リスト内の任意の要素と一致するよりも、行を選択するにはどうすればよいです?


これは私の願望出力されます:

> df_solution 
    mrun          address stat 
17625851    rancagua 2777 , Iquique, Tarapacá OK 
3459140   balmaceda 935 , Temuco, La Araucanía OK 
24507700    rancagua 1940, La Serena, Coquimbo OK 

編集: sauravのシェカールによって与えられた解決策は、いくつかの要素を持つADDRESS_LISTのために動作します。

> df$flag[grep(address_list,df$address)]<- 1 
Error in grep(address_list,df$address) : 
    invalid regular expression, reason 'Out of memory' 

私はそれについて考えていないので、私は多くのRAMを持っている:私の場合、私の本当のADDRESS_LISTは5000行とDFの上に、このエラーがスローされます200000個の行とgrepを持っていました。私は解決策を探しましたが、私はそれを行う方法が見つかりませんでした。 SOの唯一のスレッドはthis linkですが、私のケースにどのように適用するのか分かりませんでした。

私のセッション情報:あなたがする必要がある

> sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

locale: 
[1] LC_COLLATE=Spanish_Latin America.1252 LC_CTYPE=Spanish_Latin America.1252 
[3] LC_MONETARY=Spanish_Latin America.1252 LC_NUMERIC=C       
[5] LC_TIME=Spanish_Latin America.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] gridExtra_2.2.1 ggplot2_2.2.0 plyr_1.8.4  reshape_0.8.6 

答えて

0

まず最初にフォーマットを以下に一致する変数を作成することです:

address_list<- paste(address_list, collapse = ",") 
address_list<- gsub("," , "|" , address_list) 
address_list<- c("balmaceda|rancagua|bombero|garrido") 

次に、あなたがあなたのデータの部分一致検索を行うことができますgrepを使用し、保持する行のフラグを作成します。

# grep(address_list,df$address) Try this and note the output for your understanding of `grep` 

df$flag<- NA 
df$flag[grep(address_list,df$address)]<- 1 #flag rows with matching values 
df_new<- df[which(df$flag==1),] 
+0

私はこれを試してみます。ちなみに、私のaddress_listには1500の値があります。パイプ内でこれらの値をすべてリスト内で区切る方法はありますか? –

+0

"bombero garrido"は1つの文字列なので、df $ adrressの値は "bombero garrido 23345、Valdivia、losríos"、 "bombero garrido 138、Antofagasta、Antofagasta"などです。あなたの考えは、 bombero garrido " –

+0

あなたの2番目のコメントに - テキストを別々にしておくか、それとも一緒に使うべきかどうか。まだ問題がある場合は教えてください –

関連する問題