2016-05-17 3 views
1

Ich bin in eine Sackgasse geraten mit einigem R-Code, den ich geschrieben habe, und ich dachte, vielleicht wüsstest du, wie man das Ganze machbar macht, in dem Sinne, dass die Effizienz verbessert werden kann.R - mehr als 7 Millionen Beobachtungen - Wie steigert man die Effizienz?

Also, was ich versuche zu tun, der folgende:

Ich habe mit ~ 7 Millionen Beobachtungen einen Tweet-Datensatz einsehen. Momentan bin ich nicht an dem Text der Tweets oder irgendwelcher der anderen Metadaten interessiert, sondern nur an dem "Location" -Feld, also habe ich diese Daten in einen neuen data.frame extrahiert, der die Standortvariable enthält (string) und eine neue, derzeit leere Variable "isRelevant" (logisch). Außerdem habe ich einen Vektor mit Textinformationen, die wie folgt formatiert sind: "Ortsname (1) | Ortsname (2) [...] | Ortsname (i)". Was ich versuche, ist grepl jede Zeile der Variablen locations zu sehen, ob es eine Übereinstimmung mit dem Vektor Ortsnamen gibt, und wenn ja, geben Sie einen "TRUE" in der Variable IsRelevant zurück und geben ein "FALSE" zurück, wenn nicht.

Um dies zu tun, schrieb ich einige R-Code, der im Wesentlichen auf dieser Linie läuft darauf hinaus:

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

wobei grep_places ist die Liste der möglichen Übereinstimmungen Begriffe getrennt durch „|“ Zeichen, um R wissen zu lassen, dass es mit irgendeinem der Elemente im Vektor übereinstimmen kann. Ich benutze dies auf einem Remote-Computer mit hoher Kapazität, der über 2 TB RAM mit RStudio (R 3.2.0) zur Verfügung stellt, und ich benutze es mit "pbsapply", die mir einen Fortschrittsbalken bietet. Wie sich herausstellt, dauert dies lächerlich lang. Es ist bis jetzt etwa 45% fertig (ich habe es vor mehr als einer Woche angefangen) und es sagt, dass es immer noch 270 Stunden brauchen wird, um es zu vervollständigen. Das ist offensichtlich nicht wirklich eine praktikable Situation, da ich in der Zukunft ähnlichen Code ausführen muss, indem ich viel größere Datensätze verwende. Haben Sie eine Idee, wie ich diese Arbeit in einem akzeptableren Zeitrahmen erledigen könnte, vielleicht wie eines Tages oder so (in Anbetracht des superstarken Computers)?

EDIT

Hier einige halb simulierten Daten, um anzuzeigen, was mit arbeite ich etwa wie folgt aussieht:

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 

Vielen Dank im Voraus jeder, würde ich schätzen ernsthaft jede Hilfe mit diesem.

+1

Dies ist eine vernünftige Frage, wie es steht wäre aber besser, wenn man ein bisschen zur Verfügung gestellt (simuliert) Daten um ein [reproduzierbares Beispiel] zu liefern (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) ... –

+0

Hi Ben. Entschuldigung für die Auslassung. Ich habe jetzt einige Daten hinzugefügt. Prost! – nikUoM

+0

Möglicherweise haben Sie mehr Glück mit einigen der Funktionen im 'strai'-Paket, die dazu neigen, andere Regex-Funktionen zu übertreffen. – nrussell

Antwort

3

grepl ist eine vektorisierte Funktion, es sollte keine Schleife angelegt werden müssen. Haben Sie versucht:

#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 

oder für eine etwas schnellere Implementierung, wie pro David Arenburg Kommentar:

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