convertir datos.formato de columna de marco de carácter a factor


Estoy programando en lenguaje R. Me gustaría cambiar el formato (clase) de algunas columnas de mis datos.objeto frame (mydf) desde charactor hasta factor. No quiero hacer esto cuando estoy leyendo el archivo de texto por la función read.table(). Cualquier ayuda sería apreciada.

 103
Author: sjakobi, 2012-02-12

6 answers

Hola bienvenidos 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 caracteres, fechas, enteros y otras clases

Ya que eres nuevo en R Te sugiero que eches un vistazo a estos dos sitios web:

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

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

 145
Author: Tyler Rinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-12 23:16:27
# 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 dataframes son listas y los resultados de [ utilizados con múltiples argumentos de valor son igualmente listas, por lo que el bucle sobre listas es la tarea de lapply. La asignación anterior creará un conjunto de listas en las que la función data.frame.[<- debería insertarse correctamente en el dataframe, df

Otra estrategia sería convertir sólo las columnas donde el número de elementos es menor que algún criterio, digamos menos que el registro del número de filas como un ejemplo:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
 70
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-11 17:54:19

Si desea cambiar todas las variables de caracteres en sus datos.frame to factors después de que ya hayas cargado tus datos, puedes hacerlo así, a un dato.marco 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 la clase character, luego se aplica as.factor a esas columnas.

Datos de muestra:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )
 9
Author: Sam Firke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 21:59:02

Otra forma corta que podría usar es una tubería (%<>%) del paquete magrittr. Convierte el carácter column mycolumn a un factor.

library(magrittr)

mydf$mycolumn %<>% factor
 7
Author: chrimuelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 12:35:42

Lo he hecho con una función. En este caso solo transformaré variables de caracteres a factor:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
 2
Author: user3397644,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 23:47:54

Puede usar dplyr::mutate_if() para convertir todas las columnas de caracteres o dplyr::mutate_at() para seleccionar columnas de caracteres con nombre a 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)
 1
Author: sbha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 11:38:07