Ich habe eine große Datei, die viele Daten enthält, und ich möchte sie in den Dataframe einlesen, habe aber einige ungültige Zeilen gefunden. Diese ungültigen Zeilen bewirken, dass die read.table bricht. Ich versuche die folgende Methode, um ungültige Zeilen zu überspringen, aber es scheint, dass die Leistung sehr schlecht ist.
%Vor%Gibt es einen besseren Weg, dies zu erreichen? Danke
Sie können die Zeilen in der Datei durchlaufen und nur die Zeilen mit der richtigen Länge hinzufügen.
Ich habe die folgende csv-Testdatei definiert:
%Vor% Die Verwendung von read.table
schlägt fehl:
Jetzt ein iterativer Ansatz:
%Vor%Natürlich ist das ein triviales Beispiel, da die Datei sehr klein ist. Lassen Sie uns ein herausfordernderes Beispiel als Benchmark erstellen.
%Vor%Jetzt zum Benchmark
%Vor% Der iterative Ansatz ist also ein wenig langsamer, aber 20 Sekunden für 1 Million Zeilen könnten akzeptabel sein (obwohl dies von Ihrer Definition von acceptable abhängt). Vor allem, wenn Sie nur einmal müssen, und dann speichern Sie es mit save
für späteren Abruf. Die von @ Paolo vorgeschlagene Lösung ist fast so schnell wie der normale Aufruf von read.table
. Zeilen, die die falsche Anzahl von Spalten enthalten (also NA
), werden mit complete.cases
eliminiert. Die Angabe, welche Klassen die Spalten weiter verbessern, verbessert die Leistung, und ich denke, dass dieser Effekt größer wird, wenn die Anzahl der Spalten und Zeilen größer wird.
Zusammenfassend ist die beste Option, read.table
mit fill = TRUE
zu verwenden, während die Klassen der Spalten angegeben werden. Der iterative Ansatz, der ldply
verwendet, ist nur eine gute Option, wenn Sie mehr Flexibilität bei der Wahl des Lesens der Zeilen wünschen, z. Lesen Sie die Zeile nur, wenn ein bestimmter Wert über einem Schwellenwert liegt. Aber wahrscheinlich könnte dies schneller erledigt werden, indem alle Daten in R gelesen werden und dann eine Teilmenge erzeugt wird. Nur wenn die Daten größer sind als Ihr RAM, könnte ich mir vorstellen, dass der iterative Ansatz seine Vorzüge hat.