2011-02-08 33 views
76

He importado un archivo de prueba y trató de hacer un histogramaconversión de cadena a numérico

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

Sin embargo, me sale un número diferente de los valores en mi conjunto de datos. Originalmente pensé que esto porque tenía el texto, por lo que suprime el texto:

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

Sin embargo, todavía estoy consiguiendo números muy altos, ¿alguien tiene una idea?

+0

Vea también http://stackoverflow.com/questions/4798343/ y http://stackoverflow.com/questions/3418128 – Aaron

Respuesta

97

Sospecho que tienes un problema con los factores. Por ejemplo,

> 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 

Algunos comentarios:

  • Se mencionan que su vector contiene los caracteres "abajo" y "NoData". ¿Qué espera/quiere que as.numeric haga con estos valores?
  • En read.csv, intente utilizar el argumento stringsAsFactors=FALSE
  • ¿Estás seguro de que es sep="/t y no sep="\t"
  • Utilice el comando head(pitchman) para comprobar los primeros fews filas de sus datos
  • Además, es muy difícil de adivinar lo que su problema es cuando no proporciona datos. Un ejemplo de trabajo mínimo siempre es preferible. Por ejemplo, no puedo ejecutar el comando pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") ya que no tengo acceso al conjunto de datos.
+1

Agregue un tiempo en una nueva respuesta. +1 para usted, ya que lo tenía correcto y dio todas las opciones. –

+0

¡gracias a un millón! borré los valores "Abajo" y "NoData" después de ver que no son solo números y sí tengo mis barras mezcladas – eliavs

+0

excelente +1. esto realmente me ayudó. – phoxis

10

Como dijo csgillespie. stringsAsFactors está predeterminado en TRUE, que convierte cualquier texto en un factor. Entonces, incluso después de eliminar el texto, todavía tiene un factor en su marco de datos.

Ahora, con respecto a la conversión, hay una manera más óptima de hacerlo. Así que lo puse aquí como referencia:

> 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 

Para mostrar que funciona.

Los horarios:

> 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 

Es una gran mejora, pero no siempre es un cuello de botella. Sin embargo, es importante si tienes un gran marco de datos y muchas columnas para convertir.