Esta pregunta tiene varios años, pero me encontré con ella, lo que significa que tal vez otros lo hagan.
La readr
biblioteca / paquete tiene algunas características interesantes. Uno de ellos es una buena forma de interpretar columnas "desordenadas", como estas.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Esto produce
Fuente: marco de datos local [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Un punto importante al leer en archivos: o tiene que preprocesar, como el comentario anterior sed
, o tiene que procesar mientras lee . A menudo, si intenta arreglar las cosas después de los hechos, se hacen algunas suposiciones peligrosas que son difíciles de encontrar. (Es por eso que las limas planas son tan malas en primer lugar).
Por ejemplo, si no hubiera marcado el col_types
, habría obtenido esto:
> 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
(Observe que ahora es un chr
( character
) en lugar de a numeric
.)
O, lo que es más peligroso, si fuera lo suficientemente largo y la mayoría de los elementos iniciales no contuvieran comas:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(de modo que los últimos elementos parezcan :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
¡Entonces encontrarás problemas para leer esa coma!
> 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] )
).