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.
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.
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
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).
# 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)
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).
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]
.
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)
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
)
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.
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.
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.
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 ?
0 votes
@EtienneLow-Décarie : juste
unclass
et utiliserdata.frame
sur le résultat,.