LaTeX & R
Encore un site sur R !

Juste quelques trucs pour vous aider à débuter en R & LaTeX centré sur la production de rapports via knitr ou RMarkdown.

En clair je me suis fait un aide mémoire que je partage avec vous.

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.