2016-05-31 9 views
0

Ich möchte einige Daten innerhalb eines Datenrahmens durch eine bestimmte Zeichenfolge aufgeteilt und die Häufigkeit zählen.R lapply mit stringi und rbind

Nachdem ich mit ein paar Methoden gespielt habe, habe ich eine Methode entwickelt, aber es gibt einen kleinen Fehler in meinen Ergebnissen.

Beispiel:

Datenrahmen Datendatei:

data 
abc hello 
hello 
aaa 
zxy 
xyz 

Liste:

list 
abc 
bcd 
efg 
aaa 

Mein Code:

lapply(list$list, function(x){ 
    t <- data.frame(words = stri_extract(df$data, coll=x)) 
    t<- setDT(t)[, .(Count = .N), by = words] 
    t<-t[complete.cases(t$words)] 
    result<-rbind(result,t) 
    write.csv(result, "new.csv", row.names = F) 
}) 

In diesem Beispiel würde ich eine CSV fi erwarten le mit den folgenden Ergebnissen:

words Count 
abc  1 
aaa  1 

jedoch mit meinem Code ich habe:

words Count 
aaa  1 

Ich weiß stri_extract identifizieren sollte abc innerhalb abc hello so vielleicht der Fehler passiert, wenn ich rbind verwenden?

+0

Siehe auch: 'stringi :: stri_list2matrix' – gagolews

Antwort

3

Sie müssen die write.csv Datei aus der Schleife verschieben, sonst überschreibt sie die zuvor gespeicherte Datei und Sie erhalten nur die Datei in der Endphase gespeichert. Auf diese Weise müssen Sie rbind Ihr Ergebnis außerhalb lapply, da Sie die result Variable in der Funktion nicht ändern können.

result <- do.call(rbind, lapply(list$list, function(x){ 
           t <- data.frame(words = stri_extract(df$data, coll=x)) 
           t<- setDT(t)[, .(Count = .N), by = words] 
           t<-t[complete.cases(t$words)] 
           t 
})) 

write.csv(result, "new.csv", row.names = F) 
+0

Danke, sehr hilfreich –

+0

Hättest du nicht in der Schleife mit append = T write.csv? Das würde den Prozess sowieso nur verlangsamen, ich muss nur einmal schreiben, nur –

+0

Das ist auch eine brauchbare Lösung. Sie können weitermachen und es versuchen. Ich bin mir nicht sicher über die Leistung. – Psidom