2011-12-05 20 views
6

Oggi ho finalmente deciso di iniziare a scalare la curva di apprendimento ripida di R. Ho trascorso alcune ore e sono riuscito a importare il mio set di dati e fare alcune altre cose di base, ma ho problemi con il tipo di dati: una colonna che contiene i decimali viene importata come numero intero e la conversione per raddoppiare i valori .Problemi di importazione del file csv/conversione da numero intero a raddoppio in R

nel tentativo di ottenere un piccolo file CSV per mettere qui come esempio ho scoperto che il problema si verifica solo quando il file di dati è troppo grande (il mio file originale è una matrice 1.048.418 del 12, ma anche con "solo "5000 righe Ho lo stesso problema: quando ho solo 100, 1000 o addirittura 2000 righe, la colonna viene importata correttamente come doppia).

Here è un dataset più piccolo (ancora 500kb, ma ancora una volta, se il set di dati è piccolo il problema non viene replicato). Il codice è

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

Perché la colonna dei rendimenti viene importato come intero quando il file è grande, quando è chiaramente di tipo double?

La cosa peggiore è che se provo a convertirlo in doppio, i valori vengono modificati

> 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 

Questo non è l'unica colonna che viene importato sbagliato, ma ho pensato che se trovo una soluzione per una colonna, dovrei essere in grado di ordinare gli altri. Ecco qualche informazione in più:

> 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" 

Essi dovrebbero essere in questo ordine: intero, la data, stringa, intero, doppie, matrimoniali, doppie, intero, doppie, matrimoniali, doppie, matrimoniali (i tipi sono probabilmente sbagliato, ma si spera che otterrete ciò che intendo)

+0

@Xu Wang: la prima metà non funzionerà.Riducendolo alle prime 5 mila osservazioni, meno dell'1% dei miei dati, crea già problemi ... – Vivi

+0

scusa se non ho finito il mio commento perché sono andato a leggere l'aiuto 'read.csv'. Quello che volevo dire era che pensavo che forse c'erano alcuni strani valori che confondevano 'R'. Quindi ho pensato che non fosse il fatto di grandi o piccoli, ma piuttosto che il set di dati di grandi dimensioni ha uno di quei personaggi o valori confusi. Ha senso? In caso contrario, non importa. Penso che la soluzione sia usare l'argomento colClasses. –

+0

@Xu Wang Capisco cosa stai dicendo, ma non sono ancora abbastanza sicuro di come risolvere il mio problema. Come si usa l'argomento colClasses? Sareste in grado di darmi il comando di una riga per importare correttamente questo file usando l'argomento colClasses? – Vivi

risposta

6

Vedere la guida per read.csv: ?read.csv. Ecco la sezione pertinente:

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). 

Buona fortuna con la vostra ricerca per imparare difficile, ma molto divertente di R. E dopo aver ottenuto oltre le prime fasi (che ammetto non richiedere un certo tempo).

provare questo e fissare gli altri di conseguenza:

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

Come BenBolker sottolinea, l'argomento colClasses probabilmente non è necessario. Tuttavia, si noti che l'utilizzo dell'argomento colClasses può rendere l'operazione più veloce, in particolare con un set di dati di grandi dimensioni.

na.strings deve essere specificato. Vedere la sezione seguente in ?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. 

A titolo di riferimento (questo non dovrebbe essere usato come soluzione perché la soluzione migliore è quella di importare correttamente i dati in un solo passaggio): RET non è stato importato come un intero. È stato importato come factor. Per riferimento futuro, se si desidera convertire un factor ad un numeric, utilizzare

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

+0

Avevo letto questa parte dell'aiuto, ma onestamente non capisco cosa significhi tutto questo (ho solo iniziato a usare R oggi). Quella colonna ha solo valori 0 o double e non ci sono valori mancanti. – Vivi

+0

Ah, ok. Quali sono le altre colonne nel set di dati che si suppone essere? Importano ok? Potresti postare l'output di 'sapply (ex, classe)'. –

+0

Ho aggiunto le informazioni richieste alla fine della mia domanda – Vivi

Problemi correlati