Cette question date de plusieurs années, mais je suis tombée dessus, ce qui signifie que d'autres le feront peut-être.
La readr
bibliothèque / package a quelques fonctionnalités intéressantes. L'une d'elles est une manière agréable d'interpréter des colonnes «désordonnées», comme celles-ci.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Cela donne
Source: trame de données locale [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Un point important lors de la lecture de fichiers: soit vous devez pré-traiter, comme le commentaire ci-dessus concernant sed
, soit vous devez traiter pendant la lecture . Souvent, si vous essayez de réparer les choses après coup, certaines suppositions dangereuses sont difficiles à trouver. (C'est pourquoi les fichiers plats sont si mauvais en premier lieu.)
Par exemple, si je n'avais pas signalé le col_types
, j'aurais obtenu ceci:
> 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
(Notez que c'est maintenant un chr
( character
) au lieu d'un numeric
.)
Ou, plus dangereusement, s'il était assez long et que la plupart des premiers éléments ne contenaient pas de virgules:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(tel que les derniers éléments ressemblent à :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
Ensuite, vous aurez du mal à lire cette virgule!
> 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] )
).