web-dev-qa-db-fra.com

Convertit le format de colonne data.frame de caractère en facteur

Je voudrais changer le format (la classe) de certaines colonnes de mon objet data.frame (mydf) de charactor à factor.

Je ne veux pas faire cela lorsque je lis le fichier texte avec la fonction read.table().

Toute aide serait appréciée.

130
Rasoul

Bonjour, bienvenue dans le monde 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

Cela fonctionne aussi pour le caractère, les dates, les nombres entiers et les autres classes.

Étant donné que vous êtes nouveau dans R, je vous suggère de jeter un coup d'œil sur ces deux sites Web:

R manuels de référence: http://cran.r-project.org/manuals.html

R Carte de référence: http://cran.r-project.org/doc/contrib/Short-refcard.pdf

173
Tyler Rinker
# 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)

Explication. Tous les cadres de données sont des listes et les résultats de [ utilisé avec plusieurs arguments de valeur sont également des listes. Par conséquent, le survol de listes est la tâche de lapply. L'affectation ci-dessus créera un ensemble de listes dans lesquelles la fonction data.frame.[<- devrait revenir dans le cadre de données, df

Une autre stratégie consisterait à ne convertir que les colonnes où le nombre d'éléments uniques est inférieur à un critère, par exemple inférieur au journal du nombre de lignes, à titre d'exemple:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
78
42-

Vous pouvez utiliser dplyr::mutate_if() pour convertir toutes les colonnes de caractères ou dplyr::mutate_at() pour sélectionner des colonnes de caractères nommés en facteurs:

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)
18
sbha

Si vous voulez modifier les toutes caractères de votre nom de données data.frame en facteurs après le chargement de vos données, vous pouvez le faire comme ceci, en un nom de données.fr appelé dat:

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

Cela crée un vecteur identifiant les colonnes de classe character, puis applique as.factor à ces colonnes.

Échantillon de données:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )
16
Sam Firke

Vous pouvez également utiliser un tube (%<>%) du package magrittr. Il convertit la colonne de caractères mycolumn en facteur.

library(magrittr)

mydf$mycolumn %<>% factor
11
chrimuelle

Je l'ai fait avec une fonction. Dans ce cas, je ne transformerai que les variables de caractère en facteurs:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
4
user3397644