J'ai une trame de données de classe mixte (numérique et facteur) où j'essaie de convertir la trame de données entière en numérique. Ce qui suit illustre le type de données avec lesquelles je travaille ainsi que le problème que je rencontre:
> a = as.factor(c(0.01,0.02,0.03,0.04))
> b = c(2,4,5,7)
> df1 = data.frame(a,b)
> class(df1$a)
[1] "factor"
> class(df1$b)
[1] "numeric"
Lorsque j'essaie de convertir l'ensemble du bloc de données en numérique, cela modifie les valeurs numériques. Par exemple:
> df2 = as.data.frame(sapply(df1, as.numeric))
> class(df2$a)
[1] "numeric"
> df2
a b
1 1 2
2 2 4
3 3 5
4 4 7
Les messages précédents sur ce site suggèrent d'utiliser as.numeric(as.character(df1$a))
, ce qui fonctionne très bien pour une colonne. Cependant, je dois appliquer cette approche à une trame de données qui peut contenir des centaines de colonnes.
Quelles sont mes options pour convertir une trame de données entière de facteur en numérique, tout en préservant les valeurs décimales numériques?
Voici la sortie que je voudrais produire où a
et b
sont numériques:
a b
1 0.01 2
2 0.02 4
3 0.03 5
4 0.04 7
J'ai lu les articles connexes suivants, bien qu'aucun d'entre eux ne s'applique directement à ce cas:
Vous devrez peut-être faire quelques vérifications. Vous ne pouvez pas convertir en toute sécurité des facteurs directement en numérique. as.character
doit être appliqué en premier. Sinon, les facteurs seront convertis en leurs valeurs de stockage numériques. Je vérifierais chaque colonne avec is.factor
puis contraignez à numérique si nécessaire.
df1[] <- lapply(df1, function(x) {
if(is.factor(x)) as.numeric(as.character(x)) else x
})
sapply(df1, class)
# a b
# "numeric" "numeric"
Utiliser dplyr
(un peu comme sapply ..)
df2 <- mutate_all(df1, function(x) as.numeric(as.character(x)))
qui donne:
glimpse(df2)
Observations: 4
Variables: 2
$ a <dbl> 0.01, 0.02, 0.03, 0.04
$ b <dbl> 2, 4, 5, 7
de votre df1 qui était:
glimpse(df1)
Observations: 4
Variables: 2
$ a <fctr> 0.01, 0.02, 0.03, 0.04
$ b <dbl> 2, 4, 5, 7
df2 <- data.frame(apply(df1, 2, function(x) as.numeric(as.character(x))))
> df2 <- data.frame(sapply(df1, function(x) as.numeric(as.character(x))))
> df2
a b
1 0.01 2
2 0.02 4
3 0.03 5
4 0.04 7
> sapply(df2, class)
a b
"numeric" "numeric"