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?
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)))
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 queas.numeric(as.character(f))
.
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 NA
s.
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).
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.