Pour les débutants, une fonction bien pratique expliquée pas par pas.
J’ai un data.frame nommé [*mondata*] avec les colonnes 5 à 15 contenant des "oui" ou "non". Je voudrai, pour des raisons qui me concernent, créer un nouveau data.frame [*mondata.n*] avec les mêmes colonnes codés en numérique, 0 pour "
mondata.n <- as.data.frame(sapply(mondata[,5:15], function(x) as.numeric(x)-1))
Décorticons.
- La fonction [**sapply*] va me retourner une liste que je transforme en data.frame.
- Pour extraire des données d’un data.frame on utilise les crochets avec deux chiffres : les lignes (cas) avant la virgule & les colonnes (variables) après la virgule. Par exemple pour sortir la variable 6 on écrit :
data[,6]
et pour le cas n° 6 [1]
data[6,]
.
On peut bien entendu extraire plusieurs colonnes (ou lignes) avec par ex.
data[,c(6,8,14)]
pour ne sélectionner que les colonnes 6, 8 & 14. Comme je veux sélectionne une plage je simplifie avec
5:15
. - Par défaut les facteurs sont codés en 1,2,.... Je vais donc avoir 1 pour "
non " & 2 pour "oui " (les facteurs sont codés par ordre alphabétique sauf indication contraire). D’où le -1 pour voir un codage en 0/1. Et c’est tout. De plus comme il n’y a pas de boucle mais juste des fonctions vectorielles c’est très rapide. Et on peut faire mieux avec les packages [*purrr*] & [*dplyr*]. On utilise la fonction [**man*] qui se comporte comme une version améliorée de [**sapply*], dans sa version [**map_dfr*] qui va retourner un data.frame :
–mondata.n <- map_dfr(mondata[,5:15], as.numeric)-1
- Bon le "-1" est un peu du bricolage. Écrivons ça correctement en utilisant des pipes : chaque [**%>%*] envoie le résultat de la ligne comme premier argument de la fonction suivante.
- mondata.n <- mondata[,5:15] %>%
- 1
- trois lignes d’accord, mais c’est clair, facilement évolutif.