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


153

Je voudrais changer le format (classe) de certaines colonnes de mon objet data.frame ( mydf) de caractère en facteur .

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

Toute aide serait appréciée.


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe

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.
Rasoul

Un moyen de le faire automatiquement pour toutes les variables de caractères, comme le fait data.frame avec stringsAsFactors?
Etienne Low-Décarie

@ EtienneLow-Décarie: juste unclasset utiliser data.framesur le résultat ,.
IRTFM

Réponses:


197

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 entiers et d'autres classes

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

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

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


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.)
Rasoul

1
@Rasoul, mydf[, col_names]va faire ça
DrDom

3
+1 pour les réf. Ce sont des choses basiques, ce que vous pouvez demander, mais c'est aussi bien d'être conscient du travail considérable qui a été mis dans ces travaux (et similaires).
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)

Explication. Toutes les dataframes sont des listes et les résultats de [utilisés avec plusieurs arguments valués sont également des listes, donc boucler sur des listes est la tâche de lapply. L'affectation ci-dessus créera un ensemble de listes dans lesquelles la fonction data.frame.[<-devrait réussir à se réinsérer dans le dataframe,df

Une autre stratégie serait de ne convertir que les colonnes où le nombre d'éléments uniques est inférieur à un certain critère, disons 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)

C'est une très belle solution! Il peut également fonctionner avec des numéros de colonne, ce qui peut être particulièrement utile si vous souhaitez 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) puis df [, col_nums] <- lapply (df [, col_nums] , facteur).
WGray

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, puis lapplyessaie d'opérer sur chaque entrée plutôt que sur la colonne dans son ensemble. Cela peut être évité en utilisant df[,col_names,drop=FALSE].
P Schnell du

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

27

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

Si vous souhaitez changer toutes les variables de caractères de votre data.frame en 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 de classe character, puis s'appliqueas.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
                  )

La conversion complète de chaque variable de caractère en facteur se produit généralement lors de la lecture de données, par exemple avec stringsAsFactors = TRUE, mais cela est utile lorsque vous avez lu des données avec à read_excel()partir du readxlpackage et que vous souhaitez entraîner un modèle de forêt aléatoire qui n'accepte pas variables de caractères.
Sam Firke

13

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

library(magrittr)

mydf$mycolumn %<>% factor

Veuillez modifier avec plus d'informations. Les réponses au code uniquement et «essayez ceci» sont déconseillées, car elles ne contiennent aucun contenu interrogeable et n'expliquent pas pourquoi quelqu'un devrait «essayer ceci». Nous nous efforçons ici d'être une ressource de connaissance.
Brian Tompsett - 汤 莱恩

pls si je veux l'utiliser pour toutes les colonnes de mon df?
Mostafa

5

Je le fais avec une fonction. Dans ce cas, je ne transformerai que les variables de caractères en facteur:

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

Je pense que vous avez besoin de doubles crochets pour extraire réellement la colonne et la changer en un facteur, par exemple[[i]]
RTrain3k
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.