Transformer tout un data.frame en numérique
Article mis en ligne le 13 novembre 2021

par Philippe MICHEL

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 "non" & 1 pour "oui" (J’ai déjà expliqué pourquoi c’était une mauvaise habitude mais ça peut quand même être parfois pratique voire indispensable). Le code est simple :
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.
    1. mondata.n <- mondata[,5:15] %>%
    2. map_dfr( as.numeric) %>%
    3. 1

    Télécharger

  • trois lignes d’accord, mais c’est clair, facilement évolutif.