"Joker" dans les conditions

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

Guillaume BOURGEOIS
Messages : 4
Enregistré le : 26 Oct 2017, 11:35

"Joker" dans les conditions

Messagepar Guillaume BOURGEOIS » 26 Oct 2017, 17:02

Bonjour à tous
désolé si cette question a déjà été posée

j'ai un data frame avec deux colonnes : les noms d'inventeurs ainsi que les "codes NUTS3" qui correspondent (par exemple : "FR223","JPC08"
"US32003" "US53033"). Les deux variables sont en format texte.

j'aimerais extraire uniquement les inventeurs français : c'est à dire ceux pour lesquels le code nuts commence par FR :
Voici la fonction que j'aimerais faire tourner sous R :
french=filter(french,french$nuts3=="FR...")

==> Que mettre à la place des "..." dans cette fonction pour que R extrait automatiquement les codes nuts3 qui commencent par FR (quelles que soient les valeurs qui suivent FR)?

Merci!
Guillaume

Coraline BRIS
Messages : 6
Enregistré le : 26 Oct 2017, 13:14

Re: "Joker" dans les conditions

Messagepar Coraline BRIS » 26 Oct 2017, 17:28

Bonjour,
J'aurais plutôt utilisé la fonction substr()
Quelque chose du genre:
donnees=donnees[which(substr(donnees$nuts3,1,2)=="FR"),]

J'espère que ça t'aide :)

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: "Joker" dans les conditions

Messagepar Eric Casellas » 27 Oct 2017, 07:53

Bonjour,

Sinon il y a aussi les fonctions de la famille grep qui peuvent être utilisées

Code : Tout sélectionner

donnees[grep("FR", donnees$nuts3), ]
Eric

Guillaume BOURGEOIS
Messages : 4
Enregistré le : 26 Oct 2017, 11:35

Re: "Joker" dans les conditions

Messagepar Guillaume BOURGEOIS » 27 Oct 2017, 11:06

Bonjour,

merci bcp pour vos réponses rapides.

Donc si je comprends bien il n'y a pas de symbole sous R pour dire "n'importe quel caractère" (il me semble que sous STATA le symbole "* "fait l'affaire pour ça)?

Finalement, j'ai procédé ainsi grâce à vos messages: french=filter(french,substr(french$nuts3,1,2)=="FR")
(je préfère utiliser les fonctions du package dplyr pour leur rapidité).

Bonne journée!

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

Re: "Joker" dans les conditions

Messagepar Mickael Canouil » 27 Oct 2017, 11:30

Bonjour,

R dispose (comme presque tout les langages de programmation) des expression régulières, ainsi pour reprendre l'exemple d'Eric et votre énoncé "Commence par FR":

Code : Tout sélectionner

donnees[grep("^FR.*", donnees$nuts3), ]


Le ^ signifie "début" et . signifie un caractère quel-qu’il soit et le * est là pour définir le nombre d'occurrence (0 et plus)
https://stat.ethz.ch/R-manual/R-devel/l ... regex.html

PS: je ne suis absolument pas convaincu d'un gain de performance dans cet exemple, surtout avec l'utilisation du "grep".
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: "Joker" dans les conditions

Messagepar Serge Rapenne » 27 Oct 2017, 12:10

Bonjour,

Un test avec rbenchamrk confirme la réalité du doute de Mickael :

Code : Tout sélectionner

library(rbenchmark)
library(dplyr)

debut<-c("FR","US","CA")
dta<-data.frame(A=paste0(sample(debut,10000,replace=T)),valeur=runif(10000)) #Je construis un jeu test de 10000 lignes

benchmark(dta[grep("^FR.*", dta$A), ],dta[substr(dta$A,1,2=="FR"),],dplyr::filter(dta,substr(dta$A,1,2)=="FR"),dplyr::filter(dta,grepl("^FR.*", dta$A)))
                          test replications elapsed relative user.self sys.self user.child sys.child
4       dplyr::filter(dta, grepl("^FR.*", dta$A))          100   0.563    3.163     0.516    0.008          0         0
3 dplyr::filter(dta, substr(dta$A, 1, 2) == "FR")          100   0.514    2.888     0.476    0.000          0         0
1                     dta[grep("^FR.*", dta$A), ]          100   0.178    1.000     0.180    0.000          0         0
2              dta[substr(dta$A, 1, 2 == "FR"), ]          100   0.837    4.702     0.836    0.000          0         0

Le grep est bien le plus rapide. Je suis par contre surpris que le filter avec substr soit plus rapide que le substr direct

Serge

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

Re: "Joker" dans les conditions

Messagepar Mickael Canouil » 27 Oct 2017, 12:22

Probablement à cause de la parenthèse mal positionné ;)

Code : Tout sélectionner

dta[substr(dta$A, 1, 2 == "FR"), ]

au lieu de

Code : Tout sélectionner

dta[substr(dta$A, 1, 2) == "FR", ]


EDIT:

Code : Tout sélectionner

                                             test replications elapsed relative
4       dplyr::filter(dta, grepl("^FR.*", dta$A))          100   0.572    3.763
3 dplyr::filter(dta, substr(dta$A, 1, 2) == "FR")          100   0.564    3.711
1                     dta[grep("^FR.*", dta$A), ]          100   0.172    1.132
2              dta[substr(dta$A, 1, 2) == "FR", ]          100   0.152    1.000
  user.self sys.self user.child sys.child
4     0.572        0          0         0
3     0.564        0          0         0
1     0.172        0          0         0
2     0.152        0          0         0
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: "Joker" dans les conditions

Messagepar Serge Rapenne » 27 Oct 2017, 12:44

Oups

Serge


Retourner vers « Questions en cours »

Qui est en ligne

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