¡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:
¡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:
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)
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:
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.
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:
unclass
y usardata.frame
en el resultado.Respuestas:
Hola bienvenido al mundo de R.
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
fuente
mydf$col_names[i]
nimydf[,col_names[i]]
funciona ni funciona)?mydf[, col_names]
hará estoExplicació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 listaslapply
. La asignación anterior creará un conjunto de listas en las que la funcióndata.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:
fuente
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 luegolapply
intenta operar sobre cada entrada en lugar de la columna como un todo. Esto se puede prevenir mediante el usodf[,col_names,drop=FALSE]
.df[col_names]
.Puede usar
dplyr::mutate_if()
para convertir todas las columnas de caracteres odplyr::mutate_at()
para seleccionar columnas de caracteres con nombre en factores:fuente
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
:Esto crea un vector que identifica qué columnas son de clase
character
, luego se aplicaas.factor
a esas columnas.Data de muestra:
fuente
stringsAsFactors = TRUE
, pero esto es útil cuando, digamos, ha leído datosread_excel()
desde elreadxl
paquete y desea entrenar un modelo de bosque aleatorio que no acepta Variables de caracteres.Otra forma corta que podría usar es una tubería (
%<>%
) del paquete magrittr . Convierte la columna de caracteres mycolumn en un factor.fuente
Lo estoy haciendo con una función. En este caso solo transformaré las variables de caracteres en factor:
fuente
[[i]]