97 votes

Convertir une chaîne de caractères en numérique

J'ai importé un fichier de test et j'ai essayé de faire un histogramme.

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

Cependant, j'obtiens des chiffres différents des valeurs de mon ensemble de données. Au départ, 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, j'obtiens toujours des chiffres très élevés. Quelqu'un a-t-il une idée ?

128voto

csgillespie Points 20349

Je pense 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 "Down" et "NoData". Qu'est-ce que vous attendez/souhaitez as.numeric à faire avec ces valeurs ?
  • Sur read.csv essayez d'utiliser l'argument stringsAsFactors=FALSE
  • Vous êtes sûr que c'est sep="/t et non sep="\t"
  • Utilisez la commande head(pitchman) pour vérifier les quelques premières lignes de vos données
  • De plus, il est très difficile de deviner quel est votre problème lorsque vous ne fournissez pas de données. Un exemple fonctionnel 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") puisque je n'ai pas accès à l'ensemble des données.

10voto

Joris Meys Points 38980

Comme l'a dit csgillespie. stringsAsFactors est par défaut sur TRUE, ce qui convertit tout texte en facteur. Ainsi, même après avoir supprimé le texte, vous avez toujours un facteur dans votre dataframe.

Maintenant, en ce qui concerne la conversion, il y a une façon plus optimale 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 que ça marche.

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 

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

-2voto

Rasept Points 1

J'ai rencontré un problème similaire lors de la récupération de la sortie listée d'une routine dans une matrice.... pour une raison quelconque, elle n'est pas saisie en tant que données numériques ; c'est pourquoi j'ai utilisé une routine de boucle for pour convertir les nombres "en chaîne" en format numérique en utilisant as.numeric(), par ex.

for(i in 1:20){
  for(j in 1:6){
    x[i,j]=as.numeric(y[i,j])
  }
}   

Je ne sais pas pourquoi je ne peux pas faire ça :

x=as.numeric(y)

mais ça ne marche pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X