2016-07-13 19 views
2

Ich habe eine Textdatei in R lesen, aber die Datei scheint nicht durch Tabulatorzeichen getrennt zu sein. Die einzige Struktur der Datei besteht darin, dass Spalten immer an einem bestimmten Punkt enden (d. H. Spalten sind rechtsbündig).read.table mit "rechtsbündig" Daten

Also, gibt es zuerst einen Namen für diese Art von Datenstruktur? Dann, wie kann man es in R lesen?

2.37  2.03       2.38 
    5,397  5,082       5,609 
    13.0  21.6   15.2   15.2 
    128.0  103.1   134.2   133.4 

Nur mit read.table() nicht funktioniert, wird der fehlende Wert nicht an der richtigen Stelle ...

# download data: 
tmp <- tempfile() 
f <- download.file("http://usda.mannlib.cornell.edu/usda/waob/wasde//1990s/1995/wasde-01-12-1995.txt", tmp) 
D <- file(tmp) 
data_enc <- readLines(D, warn=FALSE) 
close(D) 
dat <- sapply(strsplit(data_enc[232:236], ":"), function(x) x[2]) 
writeLines(dat, tmp) 

## try to read data: 
read.table(tmp, fill = TRUE, sep ="", header=FALSE) 

Gibt gesetzt werden:

 V1 V2 V3 V4 
1 2.37 2.03 2.38 NA 
2 5,397 5,082 5,609 NA 
3 13.0 21.6 15.2 15.2 
+0

Relevanter Beitrag: http://StackOverflow.com/Questions/24715894 – zx8754

Antwort

1

Versuchen Sie vielleicht, read.fwf zu verwenden, um eine Tabelle mit formatierten Daten mit fester Breite zu lesen:

widths <- gregexpr("\\.\\d", readLines(tmp)[5])[[1]]+1L # line 5 looks complete 
widths <- c(widths[1], diff(widths)) # posis after the decimal points as widths 
read.fwf(tmp, widths = widths) 
#   V1   V2 V3    V4 
# 1  2.37  2.03 NA    2.38 
# 2 5,397  5,082 NA   5,609 
# 3  13.0  21.6 15.2    15.2 
# 4 128.0  103.1 134.2   133.4 
# 5 146.4  130.9 156.5   155.7 
+1

oh schön! Also sind diese Daten immer noch Daten fester Breite? Ich wurde ausgetrickst, indem ich dachte, dass die fixe Breite nicht nur das gleiche Ende, sondern auch den gleichen Start beinhaltete !? Dann wird Hadleys Paketleser es sehr einfach machen: read_fwf (tmp, fwf_empty (tmp)) – Matifou

+0

... ja, noch besser. :-) – lukeA