Recoder les modalités de plusieurs variables qualitatives

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Elodie AUMAITRE
Messages : 4
Enregistré le : 01 Fév 2018, 15:05

Recoder les modalités de plusieurs variables qualitatives

Messagepar Elodie AUMAITRE » 21 Aoû 2018, 08:30

Bonjour à tous,
voici mon problème du moment : je souhaite coder les modalités de différentes variables (passer de "oui" à 1 par exemple)
pour ce faire j'utilise fct_recode de {forcats}
voici un extrait de mon fichier data : les colonnes sont nommées X puis un numéro.
ID X22 X23 X29 X30 X31 X55 X57
1 Oui Oui Moins souvent Moins souvent Non Oui probablement ok
2 Oui Oui Tous les jours ou presque Tous les jours ou presque Oui Oui certainement ok
3 Non Oui Environ une fois par semaine Moins souvent Oui Oui certainement ok
4 Oui Oui Environ une fois par semaine Environ une fois par mois Oui Oui certainement ok
5 Oui Oui Environ une fois par semaine Environ une fois par semaine Oui Oui probablement ok
6 Non Oui Environ une fois par semaine Moins souvent Oui Oui probablement ok
7 Oui Oui Tous les jours ou presque Tous les jours ou presque Oui Oui certainement ok

manuellement en renommant colonne/colonne j'écris cela :

Code : Tout sélectionner

data$X22_rec<-fct_recode(data$X22,"1"="Oui","2"="Non")

ce qui recrée une nouvelle colonne à la suite de mon fichier, pratique car cela me permet de garder l'original.

Cela fonctionne très bien, simplement j'ai d'autres colonnes avec un codage identique (comme X23 dans l'exemple) et j'aimerai accélérer la procédure en appliquant cette fonction à plusieurs colonnes.
J'ai donc créer une fonction (je débute, soyez indulgents !) par exemple pour recoder oui et non en 1 et 2

Code : Tout sélectionner

fonc<-function(x,y)fct_recode(x,"1"="Oui","2"="Non")
data2<-apply(data[,22:23],2,FUN=fonc)


Là de nouveau cela fonctionne mais je ne sais pas comment indiquer à R de rajouter les colonnes à mon fichier (plutôt que de créer un data2, data3 et de les merger ensuite...) car je suis amené à coder toutes les colonnes de mon fichier (donc à recréer une fonction pour chaque type de codage).

Comment améliorer mon code afin que les nouvelles colonnes (codées) se rajoutent à la suite de mon data ?

merci d'avance pour votre aide
très bonne journée

Elodie

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Dominique Soudant » 21 Aoû 2018, 16:19

Code : Tout sélectionner

# Soit un code initial a, b et c
CodeInitial <- c("a","b","c")

# Je génère un vecteur de données à partir de ce code.
VecteurdeDonnées <- sample(CodeInitial,50,replace=TRUE)

# Soit un nouveau code pour mes données tel que 4->a, 5->b et 6->c
NouveauCode <- 4:6

# Recodage de mon vecteur de données avec le nouveau code.
VecteurdeDonnées <-NouveauCode[match(VecteurdeDonnées,CodeInitial)]

# Fonction à l'arrache (pas testée)
Recodage <- function(data, inputCode, outputCode) outputCode[match(data,inputCode)]
Rien dans les mains, rien dans les poches et pas d'utilisation de package.
PS cela dit, je veux bien admettre que je ne réponds pas exactement à la question ...
EDIT 00

Code : Tout sélectionner

Recodage <- function(dataframe, indexColonne, inputCode, outputCode) cbind(dataframe,outputCode[match(dataframe[,indexColonne,inputCode)]

Elodie AUMAITRE
Messages : 4
Enregistré le : 01 Fév 2018, 15:05

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Elodie AUMAITRE » 22 Aoû 2018, 14:28

Bonjour,
merci pour votre réponse. Votre première fonction

Code : Tout sélectionner

Recodage <- function(data, inputCode, outputCode) outputCode[match(data,inputCode)]
marche mais ne permet pas de traiter plusieurs colonnes (ou alors je n'ai pas trouvé comment) et on ne stocke pas le résultat dans notre data...

La 2ème fonction je n'ai pas bien compris...? je crois que les () ou [] ne sont pas bien placés
est-ce que ce code est correct ?

Code : Tout sélectionner

Recodage <- function(data, indexColonne, inputCode, outputCode)
  cbind(data,outputCode[match(data[,indexColonne],inputCode)])

cela fonctionne mais ne permet de traiter qu'une colonne à la fois...par contre on stocke bien le résultat :) j'ai l'impression que j'ai mal modifier l'emplacement des () et [] vu le nom de la colonne crée !

Code : Tout sélectionner

Age <- c(12,15,23,29) # création de la variable Age
Genre <- c("homme", "homme", "femme", "femme") # création de la variable Genre
Genre2 <- c("homme", "femme", "femme", "femme") # création de la variable Genre2 (c'est un exemple)
type<-c("user","non user","user","user")
data <- data.frame(Age, Genre,Genre2,type) # on met les 4 variables dans un tableau


Code : Tout sélectionner

inputCode<-c("homme","femme")
outputCode<-1:2
Recodage <- function(data, indexColonne, inputCode, outputCode)
  cbind(data,outputCode[match(data[,indexColonne],inputCode)])


Code : Tout sélectionner

> Recodage(data,2,inputCode, outputCode)
  Age Genre Genre2     type outputCode[match(data[, indexColonne], inputCode)]
1  12 homme  homme     user                                                  1
2  15 homme  femme non user                                                  1
3  23 femme  femme     user                                                  2
4  29 femme  femme     user                                                  2

> Recodage(data,3,inputCode, outputCode)
  Age Genre Genre2     type outputCode[match(data[, indexColonne], inputCode)]
1  12 homme  homme     user                                                  1
2  15 homme  femme non user                                                  2
3  23 femme  femme     user                                                  2
4  29 femme  femme     user                                                  2

> Recodage(data,2:3,inputCode, outputCode)
  Age Genre Genre2     type outputCode[match(data[, indexColonne], inputCode)]
1  12 homme  homme     user                                                 NA
2  15 homme  femme non user                                                 NA
3  23 femme  femme     user                                                 NA
4  29 femme  femme     user                                                 NA

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Dominique Soudant » 22 Aoû 2018, 15:52

Oui pb de [(
Non ça ne traite pas plusieurs colonnes en l'état
non pas de pb de [( le nom de la colonne est égal à la chaîne de caractère de l'expression de recodage dans le cbind.

EDIT 00 : fonction incluant la spécification d'un nom de variable

Code : Tout sélectionner

# Soit un code initial a, b et c
CodeInitial <- c("a","b","c")

# Je génère un vecteur de données à partir de ce code.
VecteurdeDonnées <- sample(CodeInitial,50,replace=TRUE)

# Soit un nouveau code pour mes données tel que 4->a, 5->b et 6->c
NouveauCode <- 4:6

# Fonction à l'arrache
Recodage <- function(data, inputCode, outputCode, outputName){
  dataOut <- as.data.frame(cbind(data,outputCode[match(data,inputCode)]))
  names(dataOut)[ncol(dataOut)] <- outputName
  return(dataOut)
  }

Recodage(VecteurdeDonnées,CodeInitial,NouveauCode,"nouveauNom")


EDIT 01
Pour traiter plusieurs colonnes ... S'il n'y en a pas tant que ça, je ferais des appels successifs à Recodage. S'il y en a vraiment beaucoup alors je ferais sans soute un data frame des recodages à faire (colonnes ColumnName inputCode, outputCode, outputName) et je ferais un by sur ce data frame, chaque ligne du DF alimentant un appel à Recodage.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Serge Rapenne » 22 Aoû 2018, 20:07

bonjour,

un approche assez différente :

Code : Tout sélectionner

#creation d'un jeu de données pour l'ex
dta<-data.frame(ID=1:3,
                X1=c("oui","non","non"),
                X2=c("souvent","non","oui"),
                X3=c("oui","souvent","souvent"),
                X4=c("non","non","oui"),
                stringsAsFactors = F)
dta
  ID  X1      X2      X3  X4
1  1 oui souvent     oui non
2  2 non     non souvent non
3  3 non     oui souvent oui

# je fabrique une liste de listes contenant les colonnes concernées et le recodage pour ces colonnes
poid<-list(type1=list(colonne=c(2,4),poid=data.frame(oui=2,non=1,souvent=3)),
           type2=list(colonne=c(3,5),poid=data.frame(oui=1,non=0,souvent=4))
)
# pour les colonnes 2 et 4; oui=2,non=1,souvent=3 et pour les colonnes 3 et 5 oui=1,non=0,souvent=4
# on peut ajouter autant de type et de recodage que nécessaire par ex on pourrait avoir type2=list(colonne=c(3,5),poid=data.frame(oui=1,non=0,souvent=4,rarement=2)

#ma fonction de recodage, en passant par des factors
Recode<-function(dta,var_poid){
  resu<-apply(dta[,var_poid$colonne],2,function(y) as.integer(factor(y,levels=colnames(var_poid$poid),labels=var_poid$poid,ordered=F)))
  return(resu)
  }

#calcul des recodages de chaque colonne
tmp<-lapply(poid,function(x) Recode(dta,x))
tmp1<-do.call("cbind",tmp)

#on remet les elements dans le bon ordre et on différencie le nom des colonnes
tmp1<-tmp1[,order(colnames(tmp1))]
colnames(tmp1)<-paste0(colnames(tmp1),"_a")

#on fusionne avec le df d'origine
dta<-cbind(dta,tmp1)

#et voilà
dta
  ID  X1      X2      X3  X4 X1_a X2_a X3_a X4_a
1  1 oui souvent     oui non    1    3    1    2
2  2 non     non souvent non    2    2    3    2
3  3 non     oui souvent oui    2    1    3    1

En espérant que ça aide

Serge

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Bastien Gamboa » 23 Aoû 2018, 07:26

Bonjour,

Serge, j'ai l'impression que tous tes 'oui' sont des 1, tous les 'non' des 2 et tous les 'souvent' des 3.
Si c'est le résultat escompté, pourquoi ne pas passer simplement par :

Code : Tout sélectionner

dta2 <- dta[,colnames(dta)!="ID"]
dta2[dta2=="oui"] <- 1
dta2[dta2=="non"] <- 2
dta2[dta2=="souvent"] <- 3
colnames(dta2) <- paste0(colnames(dta2), "_rec")
dta <- cbind(dta, dta2)

Si le recodage doit dépendre de la colonne, une autre approche avec switch :

Code : Tout sélectionner

dta<-data.frame(ID=1:3,
                X1=c("oui", "non", "non"),
                X2=c("souvent", "non", "oui"),
                X3=c("oui", "souvent", "souvent"),
                X4=c("non", "non", "oui"),
                stringsAsFactors=FALSE)
COL <- c("X1", "X2", "X3", "X4") # Choix des colonnes à recoder
dta2 <- dta[,colnames(dta)!="ID"]
for(i in COL) {
    dta2[,i] <- switch(i,
                       "X1"=mapply(dta2[,i], FUN=function(x) switch(x, "oui"=1, "non"=2) ),
                       "X2"=mapply(dta2[,i], FUN=function(x) switch(x, "oui"=1, "non"=2, "souvent"=3) ),
                       "X3"=mapply(dta2[,i], FUN=function(x) switch(x, "oui"=1, "souvent"=2) ),
                       "X4"=mapply(dta2[,i], FUN=function(x) switch(x, "non"=1, "oui"=2) ) )
}
colnames(dta2) <- paste0(colnames(dta2), "_rec")
dta <- cbind(dta, dta2)
dta
  ID  X1      X2      X3  X4 X1_rec X2_rec X3_rec X4_rec
1  1 oui souvent     oui non      1      3      1      1
2  2 non     non souvent non      2      2      2      1
3  3 non     oui souvent oui      2      1      2      2

HTH,
Bastien

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Serge Rapenne » 23 Aoû 2018, 10:43

Merci Bastien,

Effectivement, un petit oubli dans la fonction Recode (il manque un as.character):
La version correcte :

Code : Tout sélectionner

Recode<-function(dta,var_poid){
  resu<-apply(dta[,var_poid$colonne],2,function(y) as.integer(as.character(factor(y,levels=colnames(var_poid$poid),labels=var_poid$poid,ordered=F))))
  return(resu)
  }


et avec ce code :

Code : Tout sélectionner

tmp<-lapply(poid,function(x) Recode(dta,x))
tmp1<-do.call("cbind",tmp)
tmp1<-tmp1[,order(colnames(tmp1))]
colnames(tmp1)<-paste0(colnames(tmp1),"_a")

dta<-cbind(dta,tmp1)
dta
  ID  X1      X2      X3  X4 X1_a X2_a X3_a X4_a
1  1 oui souvent     oui non    2    4    2    0
2  2 non     non souvent non    1    0    3    0
3  3 non     oui souvent oui    1    1    3    1

Ce qui est bien mieux

J'ai fait ça comme ça car il n'y a rien à changer au code quelque soit le nombre de colonnes et de modalités. Il suffit de modifier poid. Les modalités peuvent également être totalement différentes selon les groupes de colonnes.
Serge

Elodie AUMAITRE
Messages : 4
Enregistré le : 01 Fév 2018, 15:05

Re: Recoder les modalités de plusieurs variables qualitatives

Messagepar Elodie AUMAITRE » 24 Aoû 2018, 13:07

Bonjour,
je suis très contente de voir toutes ces réponses. Je ne comprends pas tous les codes mais j'essaye de les faire tourner sur différents exemple pour les détailler. Je vais partir sur la fonction de Serge car je n'ai pas tout compris au switch :)
j'ai encore un peu de boulot pour me les approprier mais ça fonctionne donc c'est l'essentiel.

merci à tous !

Elodie


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité