2011-02-08 3 views
76

J'ai importé un fichier de test et a essayé de faire un histogrammeConversion chaîne en numérique

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

Cependant, je reçois des nombres différents de valeurs dans mon ensemble de données. Au départ, je pensais que ce texte parce que j'avais, je supprimé le texte:

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

Cependant, je reçois toujours un nombre très élevé que quelqu'un a une idée?

+0

Voir aussi http://stackoverflow.com/questions/4798343/ et http://stackoverflow.com/questions/3418128 – Aaron

Répondre

97

Je suppose que vous avez un problème avec les facteurs. Par exemple,

> 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 

Quelques commentaires:

  • Vous mentionnez que votre vecteur contient les caractères "vers le bas" et "NoData". Qu'est-ce que vous attendez/voulez as.numeric à faire avec ces valeurs?
  • En read.csv, essayez d'utiliser l'argument stringsAsFactors=FALSE
  • Êtes-vous sûr qu'il est sep="/t et non sep="\t"
  • Utilisez la commande head(pitchman) pour vérifier les premières FEWS lignes de vos données
  • En outre, il est très difficile de deviner ce que Le problème est lorsque vous ne fournissez pas de données. Un exemple de travail minimal est toujours préférable. Par exemple, je ne peux pas exécuter la commande pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") car je n'ai pas accès à l'ensemble de données.
+1

J'ai ajouté un timing dans une nouvelle réponse. +1 pour vous comme vous l'aviez correct et donné toutes les options. –

+0

remercier un million! J'ai supprimé les valeurs "Down" et "NoData" après avoir vu que ce n'est pas seulement des chiffres et oui j'ai eu mes slashes mélangés – eliavs

+0

excellent +1. Cela m'a vraiment aidé. – phoxis

10

En tant que csgillespie dit. stringsAsFactors est par défaut sur TRUE, ce qui convertit n'importe quel texte en facteur. Ainsi, même après la suppression du texte, vous avez toujours un facteur dans votre base de données. Maintenant, en ce qui concerne la conversion, il existe un moyen plus optimal de le faire. Donc, je l'ai mis ici comme référence:

> 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 

Pour montrer ça fonctionne.

Les horaires:

> 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 

Il est une grande amélioration, mais pas toujours un goulot d'étranglement. Cela devient important cependant si vous avez un gros dataframe et beaucoup de colonnes à convertir.

Questions connexes