2016-05-17 4 views
1

私は書いたRコードで行き詰まってしまったので、この全体を実現可能にする方法を知っていると思っていました。R - grepは700万回以上の観測 - どのように効率を上げるか?

だから、私は何をやろうとしていることは、次のとおりです。

私は〜700万観察とつぶやきデータセットを持っています。現在のところ、私はつぶやきやその他のメタデータのテキストには興味がありませんが、「場所」フィールドにしかないので、そのデータを場所変数を含む新しいdata.frameに抽出しました(文字列)と現在の空の新しい "isRelevant"変数(論理的)を返します。さらに、「Placename(1)| Placename(2)[...] | Placename(i)」という形式のテキスト情報を含むベクトルを取得しました。私がしようとしているのは、Placenamesベクトルと一致するかどうかを調べるためにlocations変数のすべての行をgreplにすることです。そうであれば、isRelevant変数に "TRUE"を返し、そうでなければ "FALSE"を返します。 「|」

locations.df$isRelevant <- sapply(locations.df$locations, function(s) grepl(grep_places, s, ignore.case = TRUE)) 

せるgrep_placesで区切っ可能一致する用語のリストです:

はこれを行うには、私は基本的にこのラインに帰着するいくつかのRコードを書きましたRにベクトルのどの要素にもマッチすることがわかるようにする。私はこれをRStudio(R 3.2.0)を使用して2 TB以上のRAMを提供する大容量の大容量コンピュータで実行しています。私はプログレスバーを提供する 'pbsapply'で実行しています。それは明らかに、をととらえています。これまでに約45%(私はそれを1週間以上前に開始しました)に完了し、それを完了するのにまだ270時間以上かかることがあると言います。これは明らかに実際には実行可能な状況ではありません。将来的に同様のコードを実行し、大きなデータセットを使用する必要があります。おそらく、私はこの仕事を、より受け入れやすい時間枠で、おそらく一日かそのようなもの(超強力なコンピュータを念頭に置いて)のようにして、どのようにしてやるか考えていますか?ここで

EDIT

は、私が働いているかを示すためにいくつかの半シミュレートされたデータは、およそのように見えます:

print(grep_places) 
> grep_places 
"Acworth NH|Albany NH|Alexandria NH|Allenstown NH|Alstead NH|Alton NH|Amherst NH|Andover NH|Antrim NH|Ashland NH|Atkinson NH|Auburn NH|Barnstead NH|Barrington NH|Bartlett NH|Bath NH|Bedford NH|Belmont NH|Bennington NH|Benton NH|Berlin NH|Bethlehem NH|Boscawen NH|Bow NH|Bradford NH|Brentwood NH|Bridgewater NH|Bristol NH|Brookfield NH|Brookline NH|Campton NH|Canaan NH|Candia NH|Canterbury NH|Carroll NH|CenterHarbor NH|Charlestown NH|Chatham NH|Chester NH|Chesterfield NH|Chichester NH|Claremont NH|Clarksville NH|Colebrook NH|Columbia NH|Concord NH|Conway NH|Cornish NH|Croydon NH|Dalton NH|Danbury NH|Danville NH|Deerfield NH|Deering NH|Derry NH|Dorchester NH|Dover NH|Dublin NH|Dummer NH|Dunbarton NH|Durham NH|EastKingston NH|Easton NH|Eaton NH|Effingham NH|Ellsworth NH|Enfield NH|Epping NH|Epsom NH|Errol NH|Exeter NH|Farmington NH|Fitzwilliam NH|Francestown NH|Franconia NH|Franklin NH|Freedom NH|Fremont NH|Gilford NH|Gilmanton NH|Gilsum NH|Goffstown NH|Gorham NH|Goshen NH|Grafton NH|Grantham NH|Greenfield NH|Greenland NH|Greenville NH|Groton NH|Hampstead NH|Hampton NH|HamptonFalls NH|Hancock NH|Hanover NH|Harrisville NH|Hart'sLocation NH|Haverhill NH|Hebron NH|Henniker NH|Hill NH|Hillsborough NH|Hinsdale NH|Holderness NH|Hollis NH|Hooksett NH|Hopkinton NH|Hudson NH|Jackson NH|Jaffrey NH|Jefferson NH|Keene NH|Kensington NH|Kingston NH|Laconia NH|Lancaster NH|Landaff NH|Langdon NH|Lebanon NH|Lee NH|Lempster NH|Lincoln NH|Lisbon NH|Litchfield NH|Littleton NH|Londonderry NH|Loudon NH|Lyman NH|Lyme NH|Lyndeborough NH|Madbury NH|Madison NH|Manchester NH|Marlborough NH|Marlow NH|Mason NH|Meredith NH|Merrimack NH|Middleton NH|Milan NH|Milford NH|Milton NH|Monroe NH|MontVernon NH|Moultonborough NH|Nashua NH|Nelson NH|NewBoston NH|NewCastle NH|NewDurham NH|NewHampton NH|NewIpswich NH|NewLondon NH|Newbury NH|Newfields NH|Newington NH|Newmarket NH|Newport NH|Newton NH|NorthHampton NH|Northfield NH|Northumberland NH|Northwood NH|Nottingham NH|Orange NH|Orford NH|Ossipee NH|Pelham NH|Pembroke NH|Peterborough NH|Piermont NH|Pittsburg NH|Pittsfield NH|Plainfield NH|Plaistow NH|Plymouth NH|Portsmouth NH|Randolph NH|Raymond NH|Richmond NH|Rindge NH|Rochester NH|Rollinsford NH|Roxbury NH|Rumney NH|Rye NH|Salem NH|Salisbury NH|Sanbornton NH|Sandown NH|Sandwich NH|Seabrook NH|Sharon NH|Shelburne NH" 


head(location.df, n=20) 
>      location isRelevant 
1      London   NA 
2  Orleans village VT USA   NA 
3     The World   NA 
4    D M V Towson   NA 
5 Playa del Sol Solidaridad   NA 
6 Beautiful Downtown Burbank   NA 
7      <NA>   NA 
8       US   NA 
9    Gaithersburg Md   NA 
10      <NA>   NA 
11    California   NA 
12      Indy   NA 
13     Florida   NA 
14    exsnaveen com   NA 
15     Houston TX   NA 
16     Tweaking   NA 
17    Phoenix AZ   NA 
18    Malibu Ca USA   NA 
19   Hermosa Beach CA   NA 
20    California USA   NA 

事前にみんなに感謝し、私は真剣に任意の助けをいただければと思いますこれとともに。

+1

これは、そのままで、合理的な質問ですが、あなたは(シミュレートされたのビットを提供する場合は良いだろう)データを提供する[再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)... –

+0

こんにちはベン。省略して申し訳ありません。私は今いくつかのデータを追加しました。乾杯! – nikUoM

+0

他のregex関数よりも優れている 'stringi'パッケージの関数の中には、より良い運があるかもしれません。 – nrussell

答えて

3

greplはベクトル化された関数なので、ループを適用する必要はありません。あなたは試してみました:

#dput(location.df)  
location.df<-structure(list(location = structure(c(12L, 14L, 17L, 5L, 16L, 
      2L, 1L, 19L, 8L, 1L, 3L, 11L, 7L, 6L, 10L, 18L, 15L, 13L, 9L, 
     4L), .Label = c("<NA>", "Beautiful Downtown Burbank", "California", 
      "California USA", "D M V Towson", "exsnaveen com", "Florida", 
      "Gaithersburg Md", "Hermosa Beach CA", "Houston TX", "Indy", 
      "London", "Malibu Ca USA", "Orleans village VT USA", "Phoenix AZ", 
      "Playa del Sol Solidaridad", "The World", "Tweaking", "US"), class = "factor"), 
      isRelevant = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("location", 
      "isRelevant"), row.names = c(NA, -20L), class = "data.frame") 

#grep_places with places in the test data 
grep_places<-"Gaithersburg Md|Phoenix AZ" 

location.df$isRelevant[grepl(grep_places, location.df$location, ignore.case = TRUE)]<-TRUE 

またはわずかに速い実装のために、デビッドArenburgさんのコメントのとおり:

location.df$isRelevant <- grepl(grep_places, location.df$location, ignore.case = TRUE) 
関連する問題