Recuerda que en la informática un problema casi siempere puede tener más de una soluciones, por lo tanto nosotros aquí compartiremos lo mejor y más óptimo.
Solución:
Puedes usar unclass()
para mostrar los valores numéricos de las variables de los factores:
Type_peau<-as.factor(c("Mixte","Normale","Sèche","Mixte","Normale","Mixte"))
Type_peau
unclass(Type_peau)
Para hacerlo en todas las variables categóricas, puede usar sapply()
:
must_convert<-sapply(M,is.factor) # logical vector telling if a variable needs to be displayed as numeric
M2<-sapply(M[,must_convert],unclass) # data.frame of all categorical variables now displayed as numeric
out<-cbind(M[,!must_convert],M2) # complete data.frame with all variables put together
EDITAR: la solución de A5C1D2H2I1M1N2O1R2T1 funciona en un solo paso:
out<-data.matrix(M)
Sin embargo, solo funciona si su data.frame no contiene ninguna variable de carácter (de lo contrario, se pondrán en NA).
Tal vez estés después data.matrix
. De la descripción de la función:
Devuelva la matriz obtenida al convertir todas las variables en un marco de datos al modo numérico y luego unirlas como las columnas de una matriz. Los factores y los factores ordenados se sustituyen por sus códigos internos.
Ejemplo:
mydf <- data.frame(A = letters[1:5],
B = LETTERS[1:5],
C = month.abb[1:5],
D = 1:5)
str(mydf)
# 'data.frame': 5 obs. of 4 variables:
# $ A: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
# $ B: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
# $ C: Factor w/ 5 levels "Apr","Feb","Jan",..: 3 2 4 1 5
# $ D: int 1 2 3 4 5
data.matrix(mydf)
# A B C D
# [1,] 1 1 3 1
# [2,] 2 2 2 2
# [3,] 3 3 4 3
# [4,] 4 4 1 4
# [5,] 5 5 5 5
Reemplázalo todo a la vez con:
mydf[] <- data.matrix(mydf)
mydf
# A B C D
# 1 1 1 3 1
# 2 2 2 2 2
# 3 3 3 4 3
# 4 4 4 1 4
# 5 5 5 5 5
Por supuesto, si tiene muchos más tipos de columnas, primero tendrá que decidir cómo quiere manejarlos. Por ejemplo, existe la preocupación de que si hay un character
columna, data.matrix
resultaría en una columna de NA
valores, lo cual es correcto. Sin embargo, la preocupación correcta debería ser "¿Cómo le gustaría tratar con character
columnas?
Aquí hay dos opciones. Puede extender la lógica de manera similar para otros tipos de columnas.
mydf <- data.frame(A = letters[1:5],
B = LETTERS[1:5],
C = month.abb[1:5],
D = 1:5)
mydf$E <- state.abb[1:5]
str(mydf)
# 'data.frame': 5 obs. of 5 variables:
# $ A: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
# $ B: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
# $ C: Factor w/ 5 levels "Apr","Feb","Jan",..: 3 2 4 1 5
# $ D: int 1 2 3 4 5
# $ E: chr "AL" "AK" "AZ" "AR" ...
## You want to convert everything to numeric
data.matrix(data.frame(unclass(mydf)))
# A B C D E
# [1,] 1 1 3 1 2
# [2,] 2 2 2 2 1
# [3,] 3 3 4 3 4
# [4,] 4 4 1 4 3
# [5,] 5 5 5 5 5
## You only want to convert factors to numeric
mydf[sapply(mydf, is.factor)] <- data.matrix(mydf[sapply(mydf, is.factor)])
mydf
# A B C D E
# 1 1 1 3 1 AL
# 2 2 2 2 2 AK
# 3 3 3 4 3 AZ
# 4 4 4 1 4 AR
# 5 5 5 5 5 CA
library(dplyr)
mydf <- data.frame(A = letters[1:5],
B = LETTERS[1:5],
C = month.abb[1:5],
D = 1:5)
glimpse(mydf)
# Observations: 5
# Variables: 4
# $ A a, b, c, d, e
# $ B A, B, C, D, E
# $ C Jan, Feb, Mar, Apr, May
# $ D 1, 2, 3, 4, 5
Uso de funciones de predicado en dplyr
mydf %>% mutate_if(is.factor, as.numeric)
# A B C D
# 1 1 1 3 1
# 2 2 2 2 2
# 3 3 3 4 3
# 4 4 4 1 4
# 5 5 5 5 5
Reseñas y puntuaciones del post
Recuerda algo, que tienes la capacidad de esclarecer si encontraste tu disgusto .