Convierta el formato de columna data.frame de carácter a factor

153

Me gustaría cambiar el formato (clase) de algunas columnas de mi objeto hoja.de.datos ( mydf) de Charactor a factores .

No quiero hacer esto cuando estoy leyendo el archivo de texto por read.table()función.

Cualquier ayuda sería apreciada.

Rasoul
fuente
12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe
¡Gracias! Pero tengo otro problema. Tengo el nombre de cada columna en una matriz de caracteres col_names []. ¿Cómo puedo usar el comando anterior (mydf $ col_names [i]) no funciona?
Rasoul
¿Hay alguna forma de hacer esto automáticamente para todas las variables de caracteres, como data.frame lo hace con stringsAsFactors?
Etienne Low-Décarie
@ EtienneLow-Décarie: justo unclassy usar data.frameen el resultado.
IRTFM

Respuestas:

197

Hola bienvenido al mundo de R.

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

Esto también funciona para personajes, fechas, enteros y otras clases.

Como eres nuevo en R, te sugiero que eches un vistazo a estos dos sitios web:

Manuales de referencia R: http://cran.r-project.org/manuals.html

Tarjeta de referencia R: http://cran.r-project.org/doc/contrib/Short-refcard.pdf

Tyler Rinker
fuente
¡Gracias! Pero tengo otro problema. Tengo el nombre de cada columna en una matriz de caracteres col_names []. ¿Cómo puedo usar el comando anterior ( mydf$col_names[i]ni mydf[,col_names[i]]funciona ni funciona)?
Rasoul
1
@Rasoul, mydf[, col_names]hará esto
DrDom
3
+1 para las referencias. Esto es algo básico, lo cual está bien preguntar, pero también está bien conocer el extenso trabajo que se ha realizado en estos trabajos (y similares).
Roman Luštrik
84
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

Explicación. Todos los marcos de datos son listas y los resultados del [uso con múltiples argumentos valorados son también listas, por lo que la tarea es recorrer las listas lapply. La asignación anterior creará un conjunto de listas en las que la función data.frame.[<-debería volver a integrarse con éxito en el marco de datos,df

Otra estrategia sería convertir solo aquellas columnas donde el número de elementos únicos es menor que algún criterio, digamos menos que el registro del número de filas como ejemplo:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
IRTFM
fuente
Esta es una muy buena solución! También puede funcionar con números de columna que pueden ser especialmente útiles si desea cambiar muchos pero no todos. Por ejemplo, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) y luego df [, col_nums] <- lapply (df [, col_nums] , factor).
WGray
Advertencia: la primera solución no funciona si length(col_names)==1. En ese caso, df[,col_names]se degrada automáticamente a un vector en lugar de una lista de longitud 1, y luego lapplyintenta operar sobre cada entrada en lugar de la columna como un todo. Esto se puede prevenir mediante el uso df[,col_names,drop=FALSE].
P Schnell
Ese es un buen punto. La otra invocación que retendría el estado de la lista es usar df[col_names].
IRTFM
27

Puede usar dplyr::mutate_if()para convertir todas las columnas de caracteres o dplyr::mutate_at()para seleccionar columnas de caracteres con nombre en factores:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)
sbha
fuente
18

Si desea cambiar todas las variables de caracteres en su data.frame a factores después de que ya haya cargado sus datos, puede hacerlo así, a un data.frame llamado dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Esto crea un vector que identifica qué columnas son de clase character, luego se aplica as.factora esas columnas.

Data de muestra:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )
Sam Firke
fuente
La conversión completa de cada variable de caracteres a factor generalmente ocurre cuando se leen datos, por ejemplo, con stringsAsFactors = TRUE, pero esto es útil cuando, digamos, ha leído datos read_excel()desde el readxlpaquete y desea entrenar un modelo de bosque aleatorio que no acepta Variables de caracteres.
Sam Firke
13

Otra forma corta que podría usar es una tubería ( %<>%) del paquete magrittr . Convierte la columna de caracteres mycolumn en un factor.

library(magrittr)

mydf$mycolumn %<>% factor
chrimuelle
fuente
Edite con más información. Se desaconsejan las respuestas de solo código y "pruebe esto", ya que no contienen contenido que se pueda buscar y no explican por qué alguien debería "probar esto". Hacemos un esfuerzo aquí para ser un recurso para el conocimiento.
Brian Tompsett - 汤 莱恩
pls si quiero usarlo para todas las columnas de mi df?
Mostafa
5

Lo estoy haciendo con una función. En este caso solo transformaré las variables de caracteres en factor:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
usuario3397644
fuente
Creo que necesita corchetes dobles para extraer realmente la columna y cambiarla a un factor, por ejemplo[[i]]
RTrain3k