Modifier du code en utilisant dplyr

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

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Modifier du code en utilisant dplyr

Messagepar Serge Rapenne » 04 Aoû 2017, 09:15

Bonjour à tous,

Je dispose de plusieurs fichiers avec des nombres de colonnes variables, certaine de ces colonnes (avec des emplacements variables) ont un nom contenant un motif particulier. Pour ces colonnes je voudrais transformer leur contenu pour ne garder que la partie du texte avant le ":". par exemple

Code : Tout sélectionner

donnee<-data.frame(A=1:5,B_Motif=paste0(LETTERS[1:5],":1"),C=runif(5),D_Motif=paste0(LETTERS[1:5],":2"))

donnee
 A B_Motif          C D_Motif
1 1     A:1 0.08900216     A:2
2 2     B:1 0.56075012     B:2
3 3     C:1 0.55193915     C:2
4 4     D:1 0.32601006     D:2
5 5     E:1 0.94918216     E:2

Pour les colonnes B_Motif et D_Motif, je ne voudrais garder que les lettres
Pour faire ça j'ai fait comme ça :

Code : Tout sélectionner

l_motif<-grep("Motif",colnames(donnee))
donnee[,l_motif]<-apply(donnee[,l_motif],2,function(x) sapply(strsplit(x,":"), `[`, 1))
donnee
  A B_Motif          C D_Motif
1 1       A 0.08900216       A
2 2       B 0.56075012       B
3 3       C 0.55193915       C
4 4       D 0.32601006       D
5 5       E 0.94918216       E

ce qui fonctionne très bien mais est un peu prise de tête à comprendre.

Ma 1ere idée avait été d'utiliser les fonctions "mutate_if" et "contains" de dplyr, mais là je n'ai pas réussit à obtenir un code opérationnel.

Si quelqu'un a une idée, je suis preneur.

Serge

Edit :Mon message n' a pas été poster dans le but d'enrichir la discussion viewtopic.php?f=3&t=8816 :-)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Modifier du code en utilisant dplyr

Messagepar Logez Maxime » 04 Aoû 2017, 09:23

Bonjour,

tu crees une fonction pour valider le type de colonne à modifier et une pour la modification, quelque chose comme ça :

Code : Tout sélectionner

fun <- function(x) any(grepl(":", x))

fun2 <- function(x) sub(":.+$", "", x)

donnee %>% mutate_if(fun, fun2)
Cordialement,
Maxime

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Modifier du code en utilisant dplyr

Messagepar Serge Rapenne » 04 Aoû 2017, 10:01

Merci Maxime,

ça fonctionne parfaitement. Et le "sub" est bien plus simple que mon strsplit

Serge

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Modifier du code en utilisant dplyr

Messagepar Logez Maxime » 04 Aoû 2017, 12:49

re,

ça fonctionne mais il n'est pas dit que ça soit plus efficace. Apply est la fonction la plus lente de la famille des apply. Comme tu bosses sur un data.frame il vaut mieux que tu te serves de lapply :

Code : Tout sélectionner

auxi <- grep("_Motif$", names(donnee))
donnee[auxi] <- lapply(donnee[auxi] , function(x) sub(":.*$", "", x))
C'est assez compréhensible et c'est plus rapide que dplyr (au moins sur l'exemple, faudrait voir sur un jeu de données réel).

Cordialement,
Maxime

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Modifier du code en utilisant dplyr

Messagepar Serge Rapenne » 04 Aoû 2017, 13:01

Merci pour ce complément,

je vais tester avec lapply.
Au niveau des perf ce n'est pas critique mes données font moins de 200 lignes

Serge


Retourner vers « Questions en cours »

Qui est en ligne

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