web-dev-qa-db-fra.com

Conversion de chaîne en numérique

J'ai importé un fichier de test et essayé de créer un histogramme

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

Cependant, je reçois des nombres différents des valeurs de mon jeu de données. A l'origine, je pensais que c'était parce que j'avais du texte, alors j'ai supprimé le texte:

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

Cependant, je reçois toujours des chiffres très élevés. Quelqu'un a-t-il une idée?

93
eliavs

Je soupçonne 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
_

Certains commentaires:

  • Vous mentionnez que votre vecteur contient les caractères "Down" et "NoData". Qu'attend/veut que _as.numeric_ fasse avec ces valeurs?
  • Dans _read.csv_, essayez d’utiliser l’argument _stringsAsFactors=FALSE_
  • Etes-vous sûr que c'est _sep="/t_ et non _sep="\t"_
  • Utilisez la commande head(pitchman) pour vérifier les premières lignes de vos données.
  • En outre, il est très difficile de deviner quel est votre problème 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 au jeu de données.
124
csgillespie

Comme csgillespie a 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 cadre de données.

Maintenant, en ce qui concerne la conversion, il existe un moyen plus optimal de le faire. Alors je le mets 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 que ça marche.

Les timings:

> 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 

C'est une grande amélioration, mais pas toujours un goulot d'étranglement. Cela devient toutefois important si vous avez une grande base de données et beaucoup de colonnes à convertir.

10
Joris Meys