Transformer tout un data.frame en numérique
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.