web-dev-qa-db-fra.com

Comment convertir un dataframe entier en numérique tout en préservant les décimales?

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:

  1. Comment convertir une variable de facteur en numérique tout en préservant les nombres dans R Ceci fait référence à une seule colonne dans une trame de données.
  2. conversion d'un caractère en un bloc de données numérique . Ce message ne prend pas en compte les valeurs décimales.
  3. Comment puis-je convertir une colonne de facteur contenant des nombres décimaux en numérique? . Cela s'applique à une seule colonne dans un bloc de données.
20
Borealis

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" 
16
Rich Scriven

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
13
R. Prost
df2 <- data.frame(apply(df1, 2, function(x) as.numeric(as.character(x))))
3
n8sty
> 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" 
1
Jilber Urbina