web-dev-qa-db-fra.com

Comment convertir une colonne data.frame de Factor en numérique

J'ai un data.frame dont la colonne de classe est Factor. Je voudrais le convertir en numérique afin que je puisse utiliser la matrice de corrélation.

> str(breast)
'data.frame':   699 obs. of  10 variables:
 ....
 $ class                   : Factor w/ 2 levels "2","4": 1 1 1 1 1 2 1 1 1 1 ...
> table(breast$class)
  2   4 
458 241
> cor(breast)
Error in cor(breast) : 'x' must be numeric

Comment puis-je convertir une colonne Factor en une colonne numérique?

23
birdy
breast$class <- as.numeric(as.character(breast$class))

Si vous avez plusieurs colonnes à convertir en numeric

indx <- sapply(breast, is.factor)
breast[indx] <- lapply(breast[indx], function(x) as.numeric(as.character(x)))

Une autre option consiste à utiliser stringsAsFactors=FALSE lors de la lecture du fichier avec read.table ou read.csv.

Juste au cas où, d'autres options pour créer/modifier des colonnes 

 breast[,'class'] <- as.numeric(as.character(breast[,'class']))

ou 

 breast <- transform(breast, class=as.numeric(as.character(breast)))
74
akrun

De ?factor:

Pour transformer un facteur f en approximativement ses valeurs numériques d'origine, as.numeric(levels(f))[f] est recommandé et légèrement plus efficace que as.numeric(as.character(f)).

10
BrodieG

C'est FAQ 7.10 . D'autres ont montré comment appliquer cela à une seule colonne d'un bloc de données ou à plusieurs colonnes d'un bloc de données. Mais c'est vraiment traiter le symptôme, pas guérir la cause.

Une meilleure approche consiste à utiliser l'argument colClasses pour read.table et les fonctions associées pour indiquer à R que la colonne doit être numérique, de sorte qu'elle ne crée jamais de facteur et crée un nombre. Cela mettra NA pour toutes les valeurs qui ne sont pas converties en numérique.

Une autre meilleure option consiste à comprendre pourquoi R ne reconnaît pas la colonne comme numérique (généralement un caractère non numérique quelque part dans cette colonne) et à corriger les données d'origine afin qu'elles soient lues correctement sans qu'il soit nécessaire de créer NAs.

Le mieux est une combinaison des deux derniers, assurez-vous que les données sont correctes avant de les lire et spécifiez colClasses afin que R n'ait pas besoin de deviner (cela peut également accélérer la lecture).

5
Greg Snow

Au lieu de la notation $dollarsign, utilisez un bloc within:

breast <- within(breast, {
  class <- as.numeric(as.character(class))
})

Notez que vous souhaitez convertir votre vecteur en personnage avant de le convertir en numérique. Si vous appelez simplement as.numeric(class), les identifiants correspondant à chaque niveau de facteur (1, 2) ne seront pas les niveaux eux-mêmes.

0
Joe