2011-05-25 47 views
23

Tengo una serie de archivos CSV donde los números están formateados en el estilo europeo con comas en lugar de puntos decimales, es decir, 0,5 en lugar de 0.5.¿Cómo se lee en números con una coma como separador decimal?

Hay demasiados de estos archivos para editarlos antes de importarlos a R. Esperaba que haya un parámetro fácil para la función read.csv(), o un método para aplicar al conjunto de datos extraído para que R trate los datos como un número en lugar de una cadena.

+0

Debe proporcionar una información ficticia. Este puede ser un problema mucho más complicado, si sus separadores también son ','. =/ – aL3xa

+4

Tal vez podrías probar con 'read.csv2'? – Marek

+0

@Marek, eso es correcto, si el separador es ';', pero uno puede establecer fácilmente otra cadena de separación ... – aL3xa

Respuesta

37

Al marcar ?read.table, probablemente encontrará toda la respuesta que necesita.

Hay dos problemas con archivos CSV europeas (continentales):

  1. ¿Qué significa el c en csv representan? Por estándar CSV este es un ,, por csv Europea este es un ;
    sep es el argumento correspondiente en read.table
  2. Cuál es el carácter de la coma decimal? Por estándar CSV este es un ., por csv Europea este es un ,
    dec es el argumento correspondiente en read.table

Para leer el uso estándar CSV read.csv, para leer su uso csv Europea read.csv2. Estas dos funciones son solo envoltorios de read.table que establecen los argumentos apropiados.

Si su archivo no sigue ninguno de estos estándares, establezca los argumentos manualmente.

+2

no existe tal cosa como "csv europea" ". Puede consultar la representación de números en alemán/francés, ... Sin embargo, no existe una csv europea simple/simple :) – xhudik

+0

¿Puede indicar cómo leer en filas donde la coma actúa como un separador decimal y también como un separador de campo? Los valores de campo están delimitados por comillas dobles. Moví esta pregunta [aquí] (https://stackoverflow.com/questions/44855415/r-how-to-read-in-numbers-with-comma-as-a-dec-separator-a-field-separator- th). – hhh

1

quizá

as.is=T 

Esto también evita convertir las columnas de caracteres en factores

10

De ?read.table:

dec  the character used in the file for decimal points. 

y sí, se puede utilizar para que read.csv también. (Para mí: no estúpida, no se puede!)

Como alternativa, también se puede utilizar

read.csv2 

que asume una "" separador decimal y un ";" para separadores de columnas.

+2

¡Gracias! 'results <- read.csv2 (file =" results.csv ", head = TRUE, sep ="; ", dec =", ")' hizo el trabajo por mí :) – Johan

3
read.csv(... , sep=";") 

Supongamos este campo importada se llama "cantidad", se puede fijar el tipo de esta manera si sus números se leen en la que el personaje:

d$amount <- sub(",",".",d$amount) 
d$amount <- as.numeric(d$amount) 

esto he pasar a mí con frecuencia a lo largo de con un montón de otras pequeñas molestias al importar desde excel o excel csv. Como parece que no hay una forma consistente de garantizar que obtenga lo que espera al importar a R, los arreglos post-hoc parecen ser el mejor método. Con eso me refiero a MIRAR lo que importaste: asegúrate de que sea lo que esperabas y corrígelo si no es así.

+0

Me gusta la solución con 'setAs' como en las respuestas de [DWin] (http://stackoverflow.com/questions/5068705/processing-negative-number-in-accounting-format-in-r/5069649#5069649) y [ Greg Snow] (http://stackoverflow.com/questions/1523126/how-to-read-a-csv-file-in-r-where-some-numbers-contain-commas/3611619#3611619) – Marek

1

se puede utilizar como sigue:

mydata < - read.table (fileIn, desc = "")

archivo de entrada (fileIn):

D: \ TEST> más INPUT2 .txt

06-05-2014 09:19:38 3,182534 0

06-05-2014 09:19:51 4,2311 0

0

Los problemas también se pueden resolver si indica cómo se representan los valores que faltan (na.strings = ...). Por ejemplo V1 y V2 aquí tienen el mismo formato (decimales separados por "" en el archivo csv), pero desde AN están presentes en V1 se interpreta como factor de:

dat <- read.csv2("...csv", header=TRUE) 
head(dat) 

> ID x time V1 V2 
> 1 1 0:01:00 0,237 0.621 
> 2 1 0:02:00 0,242 0.675 
> 3 1 0:03:00 0,232 0.398 


dat <- read.csv2("...csv", header=TRUE, na.strings="---") 
head(dat) 

> ID x time V1 V2 
> 1 1 0:01:00 0.237 0.621 
> 2 1 0:02:00 0.242 0.675 
> 3 1 0:03:00 0.232 0.398 
0

sólo para añadir a la respuesta de Brandon anteriormente, que funcionaba bien para mí (no tengo representante suficiente para comentar):

Si está utilizando

d$amount <- sub(",",".",d$amount) 
    d$amount <- as.numeric(d$amount) 

no se olvide que es posible que tenga sub("[.]", "", d$amount, perl=T) de moverse por el carácter ..

Cuestiones relacionadas