Diese Frage ist mehrere Jahre alt, aber ich bin darauf gestoßen, was bedeutet, dass andere es vielleicht tun werden.
Die readr
Bibliothek / das Paket hat einige nette Funktionen. Eine davon ist eine gute Möglichkeit, solche "chaotischen" Spalten zu interpretieren.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Dies ergibt
Quelle: lokaler Datenrahmen [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Ein wichtiger Punkt beim Einlesen von Dateien: Sie müssen entweder vorverarbeiten, wie im obigen Kommentar zu sed
, oder Sie müssen beim Lesen verarbeiten . Wenn Sie versuchen, Dinge nachträglich zu reparieren, werden häufig einige gefährliche Annahmen getroffen, die schwer zu finden sind. (Deshalb sind Flat Files überhaupt so böse.)
Wenn ich zum Beispiel das nicht markiert col_types
hätte, hätte ich folgendes bekommen:
> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]
numbers
(chr)
1 800
2 1,800
3 3500
4 6.5
(Beachten Sie, dass es jetzt ein chr
( character
) anstelle von a ist numeric
.)
Oder gefährlicher, wenn es lang genug wäre und die meisten frühen Elemente keine Kommas enthielten:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(so dass die letzten paar Elemente aussehen :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
Dann werden Sie Probleme haben, dieses Komma überhaupt zu lesen!
> tail(read_csv(tmp))
Source: local data frame [6 x 1]
3"
(dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).