174 votes

Convertir le format de colonne de data.frame de caractère à facteur

Je voudrais changer le format (classe) de certaines colonnes de mon objet data.frame ( mydf ) de personnage a facteur .

Je ne veux pas faire ça quand je lis le fichier texte en read.table() función.

Toute aide serait appréciée.

17 votes

Mydf$myfavoritecolumn <- as.factor(mydf$myfavoritecolumn)

0 votes

Merci ! Mais j'ai un autre problème. J'ai le nom de chaque colonne dans un tableau de caractères col_names[]. Comment puis-je utiliser la commande ci-dessus (mydf$col_names[i]) ne fonctionne pas.

0 votes

Y a-t-il un moyen de le faire automatiquement pour toutes les variables de caractère, comme data.frame le fait avec stringsAsFactors ?

219voto

Tyler Rinker Points 27607

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 également pour les caractères, les dates, les nombres entiers et d'autres classes.

Puisque vous êtes nouveau sur R, je vous suggère de jeter un coup d'œil à ces deux sites web :

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

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

0 votes

Merci ! Mais j'ai un autre problème. J'ai le nom de chaque colonne dans un tableau de caractères col_names[]. Comment puis-je utiliser la commande ci-dessus (ni mydf$col_names[i] ni mydf[,col_names[i]] ne fonctionne pas).

1 votes

@Rasoul, mydf[, col_names] le fera

4 votes

+1 pour les références. Il s'agit d'un travail de base, qu'il est normal de demander, mais il est également normal d'être conscient du travail considérable qui a été effectué sur ces ouvrages (et d'autres similaires).

88voto

BondedDust Points 105234
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# to 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 l'analyse de l'ensemble de la base de données. [ utilisés avec des arguments à valeurs multiples sont de même des listes, donc le bouclage sur des listes est la tâche de lapply . L'affectation ci-dessus créera un ensemble de listes que la fonction data.frame.[<- devrait réussir à se replacer 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 certain critère, disons inférieur au logarithme du nombre de lignes, par exemple :

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

0 votes

C'est une solution très intéressante ! Elle peut également fonctionner avec les numéros de colonne, ce qui pourrait être particulièrement utile si vous vouliez en changer beaucoup mais pas tous. Par exemple, col_nums <- c(1, 6, 7:9, 21:23, 27:28, 30:31, 39, 49:55, 57) then df[,col_nums] <- lapply(df[,col_nums] , factor).

0 votes

Attention : la première solution ne fonctionne pas si length(col_names)==1 . Dans ce cas, df[,col_names] est automatiquement rétrogradé en vecteur au lieu d'une liste de longueur 1, et ensuite lapply essaie d'opérer sur chaque entrée plutôt que sur la colonne dans son ensemble. Ceci peut être évité en utilisant df[,col_names,drop=FALSE] .

0 votes

C'est un bon point. L'autre invocation qui conserverait le statut de liste serait d'utiliser df[col_names] .

32voto

sbha Points 1948

Vous pourriez 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ées 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)

18voto

Sam Firke Points 8843

Si vous voulez changer todo des variables de caractère dans votre data.frame aux facteurs après avoir déjà chargé vos données, vous pouvez le faire comme ceci, dans un data.frame 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 qui sont de classe character , alors s'applique as.factor à ces colonnes.

Exemple de données :

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

0 votes

La conversion complète de chaque variable de caractère en facteur se produit généralement lors de la lecture des données, par exemple avec stringsAsFactors = TRUE mais c'est utile quand, par exemple, vous avez lu des données avec read_excel() de la readxl et vous voulez former un modèle de forêt aléatoire qui n'accepte pas les variables de caractère.

14voto

chrimuelle Points 26

Un autre moyen court que vous pourriez utiliser est un tuyau ( %<>% ) de la magrittr paquet. Il convertit la colonne de caractères mycolonne à un facteur.

library(magrittr)

mydf$mycolumn %<>% factor

0 votes

Veuillez éditer avec plus d'informations. Les réponses de type "code uniquement" et "essayez ceci" sont déconseillées, car elles ne contiennent aucun contenu consultable et n'expliquent pas pourquoi quelqu'un devrait "essayer ceci". Nous nous efforçons ici d'être une ressource de connaissances.

0 votes

Si je veux l'utiliser pour toutes les colonnes de ma base de données ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X