Trucs pour LaTeX & R

Transformer tout un data.frame en numérique

dimanche 6 mai 2018 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.

mondata.n <- mondata[,5:15] %>%
map_dfr( as.numeric) %>%
- 1

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

[1Je ne suis pas un numéro


Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 1673 / 148396

Suivre la vie du site fr  Suivre la vie du site R   ?    |    titre sites syndiques OPML   ?

Site réalisé avec SPIP 3.2.1 + AHUNTSIC

Creative Commons License