Esta pergunta tem vários anos, mas eu tropecei nela, o que significa que talvez outros o façam.
A readr
biblioteca / pacote possui alguns recursos interessantes. Um deles é uma boa maneira de interpretar colunas "confusas", como essas.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Isso produz
Fonte: quadro de dados local [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Um ponto importante ao ler em arquivos: ou você tem que pré-processar, como o comentário acima a respeito sed
, ou você tem que processar enquanto lê . Freqüentemente, se você tentar consertar as coisas depois do fato, existem algumas suposições perigosas que são difíceis de encontrar. (É por isso que os arquivos simples são tão ruins, em primeiro lugar.)
Por exemplo, se eu não tivesse sinalizado o col_types
, teria obtido o seguinte:
> 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 agora é a chr
( character
) em vez de a numeric
.)
Ou, mais perigosamente, se fosse longo o suficiente e a maioria dos elementos iniciais não contivesse vírgulas:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(de forma que os últimos elementos se pareçam :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
Então você terá dificuldade em ler essa vírgula!
> 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] )
).