Problème lors de la conversion d'un facteur en une variable numérique dans R [fermé]

11

J'aimerais convertir une variable de facteur en une variable numérique mais as.numericn'a pas l'effet que j'attends.

Ci-dessous, j'obtiens des statistiques récapitulatives pour la version numérique de la variable basée sur la variable d'origine. Les moyens continuent de compter par 1 ... peut-être (il spécule) que les niveaux du facteur ont des noms et des nombres, et je m'attends à ce que la valeur de la nouvelle variable provienne du nom quand as.numericest-il conçu pour utiliser le nombre?

> describe.by(as.numeric(df$sch), df$sch)

group: 
  var    n mean sd median trimmed mad min max range skew kurtosis se
1   1 5389    1  0      1       1   0   1   1     0  NaN      NaN  0
--------------------------------------------------------- 
group: 001
  var  n mean sd median trimmed mad min max range skew kurtosis se
1   1 19    2  0      2       2   0   2   2     0  NaN      NaN  0
--------------------------------------------------------- 
group: 002
  var  n mean sd median trimmed mad min max range skew kurtosis se
1   1 54    3  0      3       3   0   3   3     0  NaN      NaN  0
--------------------------------------------------------- 
Michael Bishop
la source
1
J'ai supprimé les nouvelles balises que vous avez ajoutées; elles me paraissent soit trop générales et non discriminantes, soit dans le cas d'un facteur trop étroit (puisque c'est une fonction en base R). Veuillez repenser si vous pensez que quelque chose a été perdu.
JMS

Réponses:

28

C'est exact: as.numeric(factor)renvoie le nombre que R attribue au niveau de ce facteur. Tu pourrais essayeras.numeric(as.character(factor))

Richard
la source
4
Comme cette réponse le suggère, stackoverflow.com/a/3418192/476907 as.numeric(levels(f))[f] est recommandé et légèrement plus efficace queas.numeric(as.character(f))
discipulus
Je vous remercie! Cette réponse m'a beaucoup aidé :)
Yasha
13

Il s'agit de la FAQ 7.10 de la Foire aux questions. Oui, un facteur est stocké sous forme d'entiers de 1 au nombre de niveaux et as.numeric donne les codes sous-jacents. La FAQ donne 2 façons de convertir en numérique.

Cependant, cela est généralement dû au fait que lorsque vous lisez les données, il y a quelque chose dans vos données qui fait que R les traite comme un facteur plutôt que des nombres (souvent un caractère non numérique errant). Il est souvent préférable de corriger les données brutes (la conversion convertira la pièce non numérique en NA) ou d'utiliser l'argument colClasses si vous utilisez read.table ou similaire.

Greg Snow
la source
1
values.tmp <- sapply (possibleValues, as.numeric); values.nonnumeric <- values.tmp [is.na (values.tmp)]
russellpierce