2011-02-08 21 views
76

ho importato un file di prova e ha cercato di fare un istogrammaConversione stringa numerica

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") 
hist <- as.numeric(pichman$WS)  

Tuttavia, ottengo numeri diversi dai valori nel mio set di dati. Inizialmente ho pensato che questo perché ho avuto il testo, così ho cancellato il testo:

table(pichman$WS)  
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]  

Tuttavia, sono ancora ricevendo i numeri molto elevati qualcuno ha un'idea?

+0

Vedere anche http://stackoverflow.com/questions/4798343/ e http://stackoverflow.com/questions/3418128 – Aaron

risposta

97

Ho il sospetto che tu abbia un problema con i fattori. Ad esempio,

> x = factor(4:8) 
> x 
[1] 4 5 6 7 8 
Levels: 4 5 6 7 8 
> as.numeric(x) 
[1] 1 2 3 4 5 
> as.numeric(as.character(x)) 
[1] 4 5 6 7 8 

Alcuni commenti:

  • si menziona che il vettore contiene i caratteri "Down" e "NoData". Cosa si aspetta/vuole as.numeric fare con questi valori?
  • In read.csv, provare a utilizzare l'argomento stringsAsFactors=FALSE
  • Sei sicuro che sia sep="/t e non sep="\t"
  • Utilizzare il comando head(pitchman) per verificare le prime fews righe di dati
  • Inoltre, è molto difficile da indovinare che cosa il vostro il problema è quando non si forniscono dati. Un esempio di lavoro minimo è sempre preferibile. Ad esempio, non posso eseguire il comando pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") poiché non ho accesso al set di dati.
+1

Ho aggiunto un intervallo di tempo in una nuova risposta. +1 per te come lo avevi corretto e ha dato tutte le opzioni. –

+0

grazie a milioni! Ho cancellato i valori "Giù" e "NoData" dopo che ho visto che non sono solo i numeri e sì le mie barre sono state mescolate – eliavs

+0

+1 eccellente. questo mi ha davvero aiutato. – phoxis

10

Come ha detto csgillespie. stringsAsFactors è di default su TRUE, che converte qualsiasi testo in un fattore. Quindi, anche dopo aver eliminato il testo, hai ancora un fattore nel tuo dataframe.

Ora, per quanto riguarda la conversione, c'è un modo più ottimale per farlo. Quindi l'ho messo qui come riferimento:

> x <- factor(sample(4:8,10,replace=T)) 
> x 
[1] 6 4 8 6 7 6 8 5 8 4 
Levels: 4 5 6 7 8 
> as.numeric(levels(x))[x] 
[1] 6 4 8 6 7 6 8 5 8 4 

Per dimostrarlo funziona.

I tempi:

> x <- factor(sample(4:8,500000,replace=T)) 
> system.time(as.numeric(as.character(x))) 
    user system elapsed 
    0.11 0.00 0.11 
> system.time(as.numeric(levels(x))[x]) 
    user system elapsed 
     0  0  0 

E 'un grande miglioramento, ma non sempre un collo di bottiglia. Diventa importante tuttavia se hai un grande dataframe e un sacco di colonne da convertire.

Problemi correlati