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:
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:
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)
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:
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.
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:
unclass
et utiliserdata.frame
sur le résultat ,.Réponses:
Bonjour, bienvenue dans le monde de R.
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
la source
mydf$col_names[i]
nimydf[,col_names[i]]
ne fonctionne.)mydf[, col_names]
va faire çaExplication. 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 delapply
. L'affectation ci-dessus créera un ensemble de listes dans lesquelles la fonctiondata.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:
la source
length(col_names)==1
. Dans ce cas,df[,col_names]
est automatiquement rétrogradé en vecteur au lieu d'une liste de longueur 1, puislapply
essaie d'opérer sur chaque entrée plutôt que sur la colonne dans son ensemble. Cela peut être évité en utilisantdf[,col_names,drop=FALSE]
.df[col_names]
.Vous pouvez utiliser
dplyr::mutate_if()
pour convertir toutes les colonnes de caractères oudplyr::mutate_at()
pour sélectionner des colonnes de caractères nommés en facteurs:la source
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
:Cela crée un vecteur identifiant les colonnes de classe
character
, puis s'appliqueas.factor
à ces colonnes.Exemple de données:
la source
stringsAsFactors = TRUE
, mais cela est utile lorsque vous avez lu des données avec àread_excel()
partir dureadxl
package et que vous souhaitez entraîner un modèle de forêt aléatoire qui n'accepte pas variables de caractères.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.la source
Je le fais avec une fonction. Dans ce cas, je ne transformerai que les variables de caractères en facteur:
la source
[[i]]