2011-12-05 13 views
6

Hoy finalmente he decidido comenzar a escalar la empinada curva de aprendizaje de R. He pasado unas horas y he logrado importar mi conjunto de datos y hacer algunas otras cosas básicas, pero estoy teniendo problemas con el tipo de datos: una columna que contiene decimales se importa como un número entero, y la conversión a doble cambia los valores .Problemas al importar un archivo csv/conversión de un número entero al doble en R

Al tratar de obtener un pequeño archivo csv para poner aquí como ejemplo descubrí que el problema sólo ocurre cuando el archivo de datos es demasiado grande (mi archivo original es una matriz de 1.048.418 por 12, pero incluso con "solamente "5000 filas tengo el mismo problema. Cuando solo tengo 100, 1000 o incluso 2000 filas, la columna se importa correctamente como doble).

Here es un conjunto de datos más pequeño (aún 500kb, pero, de nuevo, si el conjunto de datos es pequeño, el problema no se replica). El código es

> ex <- read.csv("exampleshort.csv",header=TRUE) 
> typeof(ex$RET) 
[1] "integer" 

¿Por qué es la columna de los rendimientos que se importa como entero cuando el archivo es grande, cuando es claramente del tipo doble?

Lo peor es que si trato de convertirlo en dobles, los valores se cambian

> exdouble <- as.double(ex$RET) 
> typeof(exdouble) 
[1] "double" 

> ex$RET[1:5] 
[1] 0.005587 -0.005556 -0.005587 0.005618 -0.001862 
2077 Levels: -0.000413 -0.000532 -0.001082 -0.001199 -0.0012 -0.001285 -0.001337 -0.001351 -0.001357 -0.001481 -0.001486 -0.001488 ... 0.309524 

> exdouble[1:5] 
[1] 1305 321 322 1307 41 

Ésta no es la única columna que se importa mal, pero pensé que si encuentro una solución para una columna, debería ser capaz de ordenar los otros. Aquí hay más información:

> sapply(ex,class) 
PERMNO  DATE COMNAM  SICCD  PRC  RET  RETX SHROUT VWRETD VWRETX EWRETD EWRETX 
"integer" "integer" "factor" "integer" "factor" "factor" "factor" "integer" "numeric" "numeric" "numeric" "numeric" 

Deben ser en este orden: número entero, fecha, cadena, entero, dobles, matrimoniales, dobles, número entero, dobles, dobles, dobles, dobles (los tipos son probablemente equivocado, pero con suerte obtendrá lo que quiero decir)

+0

@Xu Wang: la primera mitad no va a funcionar.Reducirlo a las primeras 5 mil observaciones, menos del 1% de mis datos, ya crea problemas ... – Vivi

+0

siento que no terminé mi comentario porque fui y leí la ayuda 'read.csv'. Lo que quería decir es que pensé que tal vez había algunos valores extraños que confundían a 'R'. Así que pensé que no era un hecho grande o pequeño, sino que el gran conjunto de datos tiene uno de esos caracteres o valores confusos. ¿Tiene sentido? Si no, no importa. Creo que la solución es usar el argumento colClasses. –

+0

@Xu Wang Entiendo lo que dices, pero todavía no estoy muy seguro de cómo resolver mi problema. ¿Cómo uso el argumento colClasses? ¿Sería capaz de darme el comando de una línea para importar este archivo correctamente usando el argumento colClasses? – Vivi

Respuesta

6

Consulte la ayuda para read.csv: ?read.csv. Aquí está la sección correspondiente:

colClasses: character. A vector of classes to be assumed for the 
      columns. Recycled as necessary, or if the character vector 
      is named, unspecified values are taken to be ‘NA’. 

      Possible values are ‘NA’ (the default, when ‘type.convert’ is 
      used), ‘"NULL"’ (when the column is skipped), one of the 
      atomic vector classes (logical, integer, numeric, complex, 
      character, raw), or ‘"factor"’, ‘"Date"’ or ‘"POSIXct"’. 
      Otherwise there needs to be an ‘as’ method (from package 
      ‘methods’) for conversion from ‘"character"’ to the specified 
      formal class. 

      Note that ‘colClasses’ is specified per column (not per 
      variable) and so includes the column of row names (if any). 

Buena suerte con su búsqueda para aprender difícil, pero muy divertido de R. después de llegar más allá de las primeras etapas (que admito no tomar algún tiempo).

probar esto y fijar las demás en consecuencia:

ex <- read.csv("exampleshort.csv",header=TRUE,colClasses=c("integer","integer","factor","integer","numeric","factor","factor","integer","numeric","numeric","numeric","numeric"), na.strings=c(".")) 

Como BenBolker señala, probablemente no se necesita el argumento colClasses. Sin embargo, tenga en cuenta que usar el argumento colClasses puede acelerar la operación, especialmente con un gran conjunto de datos.

na.strings se deben especificar. Ver la sección siguiente en ?read.csv:

na.strings: a character vector of strings which are to be interpreted 
     as ‘NA’ values. Blank fields are also considered to be 
     missing values in logical, integer, numeric and complex 
     fields. 

Para fines de referencia (esto no debe ser usado como la solución porque la mejor solución es para importar los datos correctamente en un solo paso): RET no se importó como un entero. Se importó como factor. En el futuro, si se desea convertir un factor a un numeric, utilice

new_RET <-as.numeric(as.character(ex$RET))

+0

Había leído esta parte de la ayuda, pero sinceramente no entiendo lo que significa todo esto (solo comencé a usar R hoy). Esa columna solo tiene valores que son 0 o dobles, y no hay valores perdidos. – Vivi

+0

Ah, está bien. ¿Cuáles son las otras columnas en su conjunto de datos que se supone que es? ¿Importan bien? Podría publicar la salida de 'sapply (ex, class)'. –

+0

Agregué la información que solicitó al final de mi pregunta – Vivi

Cuestiones relacionadas