2016-07-28 9 views
0

I haben ein 'Agency_Reference' Tabellenspalte 'agency_lookup' enthält, mit 200 Einträgen von Saiten, wie nachfolgend:Optimierung der R Data.table Kombination mit für Schleifenfunktion

  1. alpha
  2. beta
  3. gamma .. etc

ich habe einen Datenrahmen ‚TEST‘ mit einer Million Zeilen eine ‚Kampagne‘ Spalte mit Einträgen wie:

  1. Alpha_xt2010
  2. alpha_xt2014
  3. Beta_xt2016 etc ..

i Schleife wollen für jeden Eintrag durch in Referenztabelle und herauszufinden, welche Zeichenfolge innerhalb jeder Kampagne Spalteneinträge vorhanden ist, und erstellen Sie eine neue Spalte agency_identifier Variable in der Tabelle.

mein aktueller Code ist wie folgt und ist langsam auszuführen. Anfordern von Anleitungen zur Optimierung derselben. Ich möchte lernen, wie man es in der data.table Art und Weise zu tun

Agency_Reference <- data.frame(agency_lookup = c('alpha','beta','gamma','delta','zeta')) 
TEST <- data.frame(Campaign = c('alpha_xt123','ALPHA345','Beta_xyz_34','BETa_testing','code_delta_')) 
TEST$agency_identifier <- 0 
for (agency_lookup in as.vector(Agency_Reference$agency_lookup)) { 
TEST$Agency_identifier <- ifelse(grepl(tolower(agency_lookup), tolower(TEST$Campaign)),agency_lookup,TEST$Agency_identifier)} 

Erwartete Ausgabe:

Kampagne ---- Agency_identifier

alpha_xt123 --- alpha

ALPHA34- --- alpha

Beta_xyz_34 ---- beta

BETa_testing ---- sein ta

code_delta _----- delta

+0

zeigen Sie ein kleines reproduzierbares Beispiel und – akrun

+0

@akrun erwartete Ausgabe: der ursprüngliche Code, den ich geschrieben hatte, Fehler hatte. Daher habe ich den Code bearbeitet, um den aktuell verwendeten Code anzuzeigen. Bitte lassen Sie mich wissen, wenn zusätzliche Informationen benötigt werden, um bei dieser Abfrage zu helfen. –

+0

Ihr Code gibt Fehler, insbesondere die 'for'-Schleife. Was ist die erwartete Ausgabe – akrun

Antwort

1

Versuchen

TEST <- data.frame(Campaign = c('alpha_xt123','ALPHA345','Beta_xyz_34','BETa_testing','code_delta_')) 

pattern = tolower(c('alpha','Beta','gamma','delta','zeta')) 

TEST$agency_identifier <- sub(pattern = paste0('.*(', paste(pattern, collapse = '|'), ').*'), 
           replacement = '\\1', 
           x = tolower(TEST$Campaign)) 
0

Dies wird Ihre Frage per se nicht beantworten, aber von dem, was ich verstehe, wollen Sie die Campaign Spalt sezieren und mit den Werten etwas tun, die es bietet.

Werfen Sie einen Blick auf Tidy data, genauer gesagt den Teil "Mehrere Variablen in einer Spalte gespeichert". Ich denke, dass Sie mit tidyr::separate große Fortschritte machen werden. Auf diese Weise müssen Sie keinen for -loop verwenden.

+0

Danke Jasper. Aber das Format der Kampagnenspalte entspricht nicht dem Standard, den ich im Beispiel angegeben habe. Daher bin ich gezwungen, grepl zu benutzen. –

+0

Im Allgemeinen ist diese Art von Sache besser als ein Kommentar als eine Antwort. – Frank