Ich versuche, diesen hässlich formatierten Datensatz in meine R-Sitzung zu laden: http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for
Weekly SST data starts week centered on 3Jan1990
Nino1+2 Nino3 Nino34 Nino4
Week SST SSTA SST SSTA SST SSTA SST SSTA
03JAN1990 23.4-0.4 25.1-0.3 26.6 0.0 28.6 0.3
10JAN1990 23.4-0.8 25.2-0.3 26.6 0.1 28.6 0.3
17JAN1990 24.2-0.3 25.3-0.3 26.5-0.1 28.6 0.3
Bisher kann ich die Zeilen mit lesen
x = readLines(path)
Aber die Datei mischt 'Leerraum' mit '-' als Trennzeichen, und ich bin kein Regex-Experte. Ich schätze jede Hilfe, die sich daraus ergibt, dass daraus ein schöner und sauberer R-Datenrahmen wird. Vielen Dank!
r
fixed-width
Fernando
quelle
quelle
read.fwf
sich die gelesenen formatierten Daten mit fester Breite an.Antworten:
Dies ist eine Datei mit fester Breite. Verwenden Sie
read.fwf()
, um es zu lesen:Aktualisieren
Das Paket
readr
(veröffentlicht im April 2015) bietet eine einfache und schnelle Alternative.Geschwindigkeitsvergleich:
readr::read_fwf()
war ~ 2x schneller alsutils::read.fwf ()
.quelle
readr::fwf_empty
werde versuchen, die Breiten für Sie zu erraten. Die Beispiele fürreadr::read_fwf
zeigen die Verwendung fürreadr::fwf_empty
.Eine andere Möglichkeit, Breiten zu bestimmen ...
Das Argument -1 im Argument widths gibt an, dass eine Spalte mit einem Zeichen ignoriert werden sollte. Das Argument -5 im Argument widths gibt an, dass eine Spalte mit fünf Zeichen ebenfalls ignoriert werden sollte.
Ref: https://www.inkling.com/read/r-cookbook-paul-teetor-1st/chapter-4/recipe-4-6
quelle
Zunächst einmal stammt diese Frage direkt aus dem Coursera-Kurs "Get Data and Clean It" von Leeks. Während es einen anderen Teil der Frage gibt, ist der schwierige Teil das Lesen der Datei.
Der Kurs ist jedoch hauptsächlich zum Lernen gedacht.
Ich hasse Rs Verfahren mit fester Breite. Es ist langsam und für eine große Anzahl von Variablen wird es sehr schnell zum Problem, bestimmte Spalten usw. zu negieren.
Ich denke, es ist einfacher zu verwenden
readLines()
und dann daraussubstr()
Ihre Variablen zu erstellenquelle
mydata <- data.frame(var4 = substr(x,29,32))
ob Sie nur die vierte Datenspalte benötigen. Für Windows-Benutzer bietet Notepad ++ mit dem TextFX-Plugin ein einfaches Lineal mit gezählten Zeichen, mit dem Sie herausfinden können, in was die Start- und Stoppwerte eingefügt werden sollensubstr
. Beachten Sie jedoch, dass der Stoppwert um eins höher ist als die Position des letzten Zeichens, das Sie beibehalten möchten.Sie können jetzt die
read_fwf()
Funktion in Hadley Wickhamsreadr
Paket verwenden.Im Vergleich zur Basis ist eine enorme Leistungsverbesserung zu erwarten
read.fwf()
.quelle
Ich dokumentiere hier die Liste der Alternativen zum Lesen von Dateien mit fester Breite in R sowie einige Benchmarks, für die die schnellsten sind.
Mein bevorzugter Ansatz ist es,
fread
mit zu kombinierenstringi
; Es ist als schnellster Ansatz wettbewerbsfähig und hat den zusätzlichen Vorteil (IMO), dass Ihre Daten wie folgt gespeichert werdendata.table
:Beachten Sie, dass
fread
führende und nachfolgende Leerzeichen automatisch entfernt werden - manchmal ist dies unerwünscht. In diesem Fall wird dies festgelegtstrip.white = FALSE
.Wir hätten auch mit einem Vektor der Spaltenbreiten beginnen können,
ww
indem wir Folgendes getan hätten:Und wir hätten auswählen können, welche Spalten robuster ausgeschlossen werden sollen, indem wir negative Indizes wie:
Dann ersetzen Sie
col_ends$beg[ii]
mitabs(col_ends$beg[ii])
und in der nächsten Zeile:Wenn Sie möchten, dass die Spaltennamen auch programmgesteuert gelesen werden, können Sie Folgendes bereinigen
readLines
:(Beachten Sie, dass zum Kombinieren dieses Schritts mit
fread
das Erstellen einer Kopie der Tabelle erforderlich ist, um die Kopfzeile zu entfernen, und daher für große Datenmengen ineffizient wäre.)quelle
Ich weiß nichts über R, aber ich kann Ihnen einen regulären Ausdruck geben, der zu solchen Zeilen passt:
quelle