tidyverse : appliquer fonction sur plusieurs colonnes

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Nicolas Halter
Messages : 23
Enregistré le : 25 Juin 2021, 08:30

tidyverse : appliquer fonction sur plusieurs colonnes

Messagepar Nicolas Halter » 08 Nov 2021, 15:21

Bonjour,

Je cherche à modifier les valeurs de plusieurs colonnes d'un tibble à l'aide de tidyverse : je veux que les valeurs à 0 restent à 0 et celles différentes de 0 deviennent 1. Quand il n'y a qu'une seule colonne je sais comment faire avec la fonction ifelse, mais sur plusieurs colonnes je ne sais pas faire sans une boucle, et si je peux éviter une boucle sur 300 000 valeurs ça m'arrangerait...

Voilà un rapide exemple reproductible :

Code : Tout sélectionner

library(tidyverse)
exemple <- tibble(age = c(4,7,8,5.5), mut = c(0,0,"HK","PS1"), pos = c(0,"7",0,"GQ"))
# Je veux dans les colonnes "mut" et "pos" une variable binaire, sur une seule colonne je ferai
exemple <- exemple %>% mutate(mut=ifelse(mut=="0", 0, 1))
# mais je ne sais pas comment le faire sur plusieurs colonnes


J'ai déjà essayé avec la fonction mutate_at en précisant la position des colonnes, mais je ne sais pas ce que je devrais mettre en argument pour ifelse.

Merci d'avoir pour votre aide.
Nicolas

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: tidyverse : appliquer fonction sur plusieurs colonnes

Messagepar Pierre-Yves Berrard » 08 Nov 2021, 15:59

Bonjour,

Le deuxième argument pour mutate_at est une fonction :

Code : Tout sélectionner

function(x) ifelse(x == "0", 0, 1)
ou, avec la syntaxe compacte de tidyverse :

Code : Tout sélectionner

~ ifelse(. == "0", 0, 1)
PY

Nicolas Halter
Messages : 23
Enregistré le : 25 Juin 2021, 08:30

Re: tidyverse : appliquer fonction sur plusieurs colonnes

Messagepar Nicolas Halter » 08 Nov 2021, 16:29

Bonjour Pierre-Yves,

Merci pour ta réponse, en fait je ne pensais pas qu'il était nécessaire d'écrire "function(x)" avant de préciser la fonction.

Mon problème est donc résolu, merci à toi !
Nicolas

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: tidyverse : appliquer fonction sur plusieurs colonnes

Messagepar Mickael Canouil » 09 Nov 2021, 16:57

Bonjour,

ou

Code : Tout sélectionner

function(.x) as.integer(.!= "0"


Exemple avec l'ecriture "lambda" ("~ .x" au lieu de "function(x) x" ou encore "\(x) x").

Code : Tout sélectionner

library(dplyr)
exemple <- tibble(age = c(4,7,8,5.5), mut = c(0,0,"HK","PS1"), pos = c(0,"7",0,"GQ"))
mutate(exemple, across(everything(), ~ as.integer(.!= "0")))
#> # A tibble: 4 x 3
#>     age   mut   pos
#>   <int> <int> <int>
#> 1     1     0     0
#> 2     1     0     1
#> 3     1     1     0
#> 4     1     1     1     


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité