Eu tenho um arquivo csv onde alguns dos valores numéricos são expressos como strings com vírgulas como separador de milhar, por exemplo, em "1,513"
vez de 1513
. Qual é a maneira mais simples de ler os dados em R?
Posso usar read.csv(..., colClasses="character")
, mas preciso retirar as vírgulas dos elementos relevantes antes de converter essas colunas em numéricas, e não consigo encontrar uma maneira legal de fazer isso.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
ousuppresMessage(setAs(.....))
para evitar a mensagem sobre a falta de aula.Quero usar R em vez de pré-processar os dados, pois torna mais fácil quando os dados são revisados. Seguindo a sugestão de Shane de usar
gsub
, acho que isso é o mais legal que posso fazer:fonte
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.Isso produz
Fonte: quadro de dados local [4 x 1]
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:(Observe que agora é a
chr
(character
) em vez de anumeric
.)Ou, mais perigosamente, se fosse longo o suficiente e a maioria dos elementos iniciais não contivesse vírgulas:
(de forma que os últimos elementos se pareçam :)
Então você terá dificuldade em ler essa vírgula!
fonte
uma
dplyr
solução usandomutate_all
e tubosdiga que você tem o seguinte:
e deseja remover vírgulas das variáveis de ano X2014-X2016 e convertê-las em numéricas. também, digamos que X2014-X2016 sejam lidos como fatores (padrão)
mutate_all
aplica a (s) função (ões) dentrofuns
das colunas especificadasFiz isso sequencialmente, uma função por vez (se você usar várias funções dentro
funs
, você criará colunas adicionais desnecessárias)fonte
mutate_each
está obsoleto. Deseja atualizar sua resposta commutate_at
ou semelhante?"Pré-processar" em R:
Pode usar
readLines
em umtextConnection
. Em seguida, remova apenas as vírgulas que estão entre os dígitos:Também é útil saber, mas não diretamente relevante para esta questão, que as vírgulas como separadores decimais podem ser manipuladas por read.csv2 (automagicamente) ou read.table (com configuração do parâmetro 'dec').
Edit: Mais tarde descobri como usar colClasses projetando uma nova classe. Vejo:
Como carregar df com separador 1000 em R como classe numérica?
fonte
Se o número for separado por "." e decimais por "," (1.200.000,00) na chamada,
gsub
você deveset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
fonte
Uma maneira muito conveniente é
readr::read_delim
-família. Pegando o exemplo aqui: Importar csv com vários separadores para R, você pode fazer da seguinte maneira:Que resulta no resultado esperado:
fonte
Usando a função read_delim, que faz parte da biblioteca readr , você pode especificar o parâmetro adicional:
* Ponto-e-vírgula na segunda linha significa que read_delim lerá valores csv separados por ponto-e-vírgula.
Isso ajudará a ler todos os números com uma vírgula como números adequados.
Saudações
Mateusz Kania
fonte
Também podemos usar
readr::parse_number
, as colunas devem ser caracteres. Se quisermos aplicá-lo a várias colunas, podemos percorrer as colunas usandolapply
Ou use
mutate_at
dedplyr
para aplicá-lo a variáveis específicas.dados
fonte
Acho que o pré-processamento é o caminho a percorrer. Você pode usar o Notepad ++, que tem uma opção de substituição de expressão regular.
Por exemplo, se o seu arquivo fosse assim:
Então, você pode usar a expressão regular
"([0-9]+),([0-9]+)"
e substituí-la por\1\2
Então você pode usar
x <- read.csv(file="x.csv",header=FALSE)
para ler o arquivo.fonte