Skip to content

[R-es] Tranformar falsas variables char en numéricas

5 messages · Christian Bravo Sánchez, Olivier Nuñez, Carlos Ortega +1 more

#
Hola usuarios de R,

Antes de nada presentarme, soy nuevo en R (antiguo... y bueno actual
usuario de SAS), llevo menos de un mes y estoy intentando empezar con
pequeñas cosas.

Hay un tema que me está llevando bastante tiempo y por más que investigo y
hago pruebas no logro saber como se hace; veréis tengo un data.frame el
cuál tiene bastante variables y todas ellas clasificadas como char, sin
embargo no todas son char sino que existen variables númericas. Dicho esto,
lo que necesito de algún modo es recorrer todas las variables y saber cual
de ellas son numéricas (y por supuesto transformarlas).

Adjunto un ejemplo reproducible:

d <- data.frame(char = letters[1:5],
                fake_char = as.character(1:5),
                fac = factor(1:5),
                char_fac = factor(letters[1:5]),
                num = 1:5, stringsAsFactors = FALSE)
d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5
'data.frame':   5 obs. of  5 variables:
 $ char     : chr  "a" "b" "c" "d" ...
 $ fake_char: chr  "1" "2" "3" "4" ...
 $ fac      : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5
 $ char_fac : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
 $ num      : int  1 2 3 4 5

Como véis la variable fake_char es numérica. Por favor tened en cuenta que
trabajo con muchas variables, la resolución (he aquí la dificultad para mí)
debería recorrer todo el data.frame de manera automática.

Muchisimas gracias de antemano.

Saludos.
#
'data.frame':   5 obs. of  5 variables:
 $ char     : chr  "a" "b" "c" "d" ...
 $ fake_char: num  1 2 3 4 5
 $ fac      : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5
 $ char_fac : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
 $ num      : int  1 2 3 4 5

Un saludo. Olivier

----- Mensaje original -----
De: "Christian Bravo Sánchez" <christian.bravo.sanchez en gmail.com>
Para: r-help-es en r-project.org
Enviados: Jueves, 8 de Octubre 2015 9:29:07
Asunto: [R-es] Tranformar falsas variables char en numéricas

Hola usuarios de R,

Antes de nada presentarme, soy nuevo en R (antiguo... y bueno actual
usuario de SAS), llevo menos de un mes y estoy intentando empezar con
pequeñas cosas.

Hay un tema que me está llevando bastante tiempo y por más que investigo y
hago pruebas no logro saber como se hace; veréis tengo un data.frame el
cuál tiene bastante variables y todas ellas clasificadas como char, sin
embargo no todas son char sino que existen variables númericas. Dicho esto,
lo que necesito de algún modo es recorrer todas las variables y saber cual
de ellas son numéricas (y por supuesto transformarlas).

Adjunto un ejemplo reproducible:

d <- data.frame(char = letters[1:5],
                fake_char = as.character(1:5),
                fac = factor(1:5),
                char_fac = factor(letters[1:5]),
                num = 1:5, stringsAsFactors = FALSE)
d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5
'data.frame':   5 obs. of  5 variables:
 $ char     : chr  "a" "b" "c" "d" ...
 $ fake_char: chr  "1" "2" "3" "4" ...
 $ fac      : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5
 $ char_fac : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
 $ num      : int  1 2 3 4 5

Como véis la variable fake_char es numérica. Por favor tened en cuenta que
trabajo con muchas variables, la resolución (he aquí la dificultad para mí)
debería recorrer todo el data.frame de manera automática.

Muchisimas gracias de antemano.

Saludos.


_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
#
Hola,

Una manera muy sencilla de hacerlo es esta:

#-------------------------------
whatcol <- 0
for(i in 1:ncol(d)){
  whatcol[i] <-class(d[,i])
}
whatcol
#--------------------------------
+   whatcol[i] <-class(d[,i])
+ }
[1] "character" "character" "factor"    "factor"    "integer"

Saludos,
Carlos Ortega
www.qualityexcellence.es



El 8 de octubre de 2015, 9:29, Christian Bravo Sánchez <
christian.bravo.sanchez en gmail.com> escribió:

  
    
#
Hola,

Y para cuando sepas un poco más....

#-----------------------------
unlist(lapply(d, class))
#-----------------------------
char   fake_char         fac    char_fac         num
"character" "character"    "factor"    "factor"   "integer"

Saludos,
Carlos Ortega

El 8 de octubre de 2015, 10:01, Carlos Ortega <cof en qualityexcellence.es>
escribió:

  
    
#
Hola,

Yo creo que lo que Christian Bravo quiere hacer no es solamente saber si 
una columna es numeric o factor o texto, sino, si es texto o factor, 
comprobar si lo almacenado "parece" numérico, y en ese caso, transformarlo.


Una manera de hacerlo sería la siguiente:

# sacamos una copia para no machacar los datos originales
d2 <- d

# evalúa la semejanza y realiza los cambios:

for(i in 1:(dim(d)[2])){
  if(!is.numeric(d[,i])){
     if(is.factor(d[,i])){
         if (identical(levels(factor(as.numeric(levels(d[,i])))),
                     levels(d[,i]))) d2[,i] <- as.numeric(d[,i])
     }	
     if(is.character(d[,i])){
        if (identical(as.character(as.numeric(d[,i])),
                       d[,i])) d2[,i] <- as.numeric(d[,i])
     }
   }
}
char   fake_char         fac    char_fac         num
"character"   "numeric"   "numeric"    "factor"   "integer"




El 08/10/2015 a las 10:06, Carlos Ortega escribió: