Wie lese ich Daten mit verschiedenen Trennzeichen?

7

Ich habe eine Datei wie folgt aussehen:

%Vor%

Das Trennzeichen zwischen 1. und 2. ist '\ t', andere Trennzeichen sind Komma. Wie kann ich diese Art von Datensatz als Datenfeld mit 5 Feldern lesen.

    
yliueagle 09.05.2014, 15:54
quelle

3 Antworten

18

Ich würde das wahrscheinlich tun.

%Vor%

Entpacken Sie das ein bisschen:

  • readLines() liest die Datei in R als Zeichenvektor mit einem Element für jede Zeile ein.
  • gsub(",", "\t", ...) ersetzt jedes Komma mit einem Tab, so dass wir jetzt Zeilen mit nur einer Art Trennzeichen haben.
  • textConnection() schließt den Zeichenvektor von (geänderten) Dateizeilen so auf, dass sie als Datei für read.table() angezeigt werden, sodass ...
  • read.table kann auf sie wie eine normale Datei zugreifen.

.

    
Josh O'Brien 09.05.2014, 15:59
quelle
8

"Ausgewogene" Daten

Gemessen an der Art und Weise, wie Sie Ihre Frage formuliert haben, scheint es, dass Sie wissen, dass Ihre Daten "ausgewogen" (rechteckig) sind.

Suchen Sie nach schnelleren Optionen? Vielleicht möchten Sie fread aus "data.table" mit meiner experimentellen Funktion concat.split.DT kombinieren.

Die Lösung würde ungefähr so ​​aussehen (ersetzen Sie " " durch "\t" für eine Registerkarte):

%Vor%

Machen wir uns ein paar Daten zurecht:

%Vor%

Joshs Antwort:

%Vor%

fread + concat.split.DT (das ist, als ob fread zweimal verwendet wird, aber immer noch super schnell ist):

%Vor%

"Unsymmetrische" Daten

Obwohl es sich nicht auf Ihr Problem bezieht, sollte ich dies zum Wohle anderer erwähnen, die ein ähnliches Problem lösen müssen:

Eine Einschränkung des oben genannten ist, dass concat.split.DT nur "ausgeglichene" Daten verarbeitet. fread hat kein fill Argument wie read.table (und ich kann mich erinnern, irgendwo gelesen zu haben, dass es höchstwahrscheinlich kein solches Argument haben wird).

Hier ist ein Beispiel für das, was ich unter unausgewogen verstehe:

%Vor%

read.table kann das mit dem Argument fill = TRUE behandeln:

%Vor%

concat.split.DT verursacht in solchen Fällen einen unangenehmen Fehler, aber Sie können stattdessen meine Funktion cSplit ausprobieren . Es ist nicht annähernd so schnell, aber immer noch anständig:

%Vor%     
A5C1D2H2I1M1N2O1R2T1 09.05.2014 16:26
quelle
0
%Vor%

Dies tat:

  1. Erstellen Sie einen Scanner, um die Datei zu verarbeiten (Scannerscan)
  2. scannen ein die nächste Dateizeile (scan.nextLine ()) für jede Dateizeile basierend auf hasNextLine ()
  3. hat Tabulatoren durch Kommas ersetzt (.replace ("\ t", ",")), Also waren die Separatoren alle gleich
  4. in ein Array geteilt durch Kommas. Jetzt können Sie alle Daten unabhängig von den Länge jeder Zeile.
  5. Vergessen Sie nicht, den Scanner zu schließen, wenn Du bist fertig.
La-comadreja 09.05.2014 18:44
quelle

Tags und Links