Fonction grep et substr

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

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Fonction grep et substr

Messagepar Anais Payen » 20 Mar 2019, 10:48

Bonjour, j'ai 2 data.frame de ce type :

DF1 :

Code : Tout sélectionner

         cip13    cip7 ucd13 ucd7                                             nom_court
1 3400930000649 3000064         NA                              A 313 50000UI CAPSULE 30
2 3400930001479 3000147         NA       A 313 A LA TYROTHRICINE POMMADE TUBE 50G 1/50 G
3 3400930139448 3013944         NA                          ABACAVIR MYLAN 300 MG 60 CPR
4 3400930089958 3008995         NA                         ABACAVIR SANDOZ 300 MG CPR 60
5 3400930059968 3005996         NA                  ABACAVIR/LAM EG 600 MG/300 MG CPR 30
6 3400930076972 3007697         NA ABACAVIR/LAMIVUDINE AUTHOU 600 MG/300 MG 30 COMPRIMES


et DF2 :

Code : Tout sélectionner

   drug_source_value count
11     3400932149544  1779
12     3400933591731  1716
25     3400509099012  1143
47     3400892697789   708
74     3400892259765   481


Et je souhaiterais faire un lien entre les codes présents dans ma colonne "drug_source_value" de mon DF2 et ma colonne "cip7" de mon DF1. Or comme vous pouvez le remarquer, ce sont des codes à 13 chiffres versus des codes à 7 chiffres.
Je sais que les fonctions grep et substr permettent de chercher des chaine de caractère, mon problème c'est que je ne cherche pas une chaine en particulier..

Je souhaiterai qu'il cherche ma ligne 1 du cip7 du DF1 dans mon DF2, puis ma ligne 2... ect..

Je sais aussi qu'un lapply me permettrait de faire l'équivalent d'une boucle, mais je ne sais pas comment chercher une chaine de caractère qui est "non définie".

Est ce que quelqu'un aurait une idée pour m'aider à avancer?

Merci d'avance!

Anais

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

Re: Fonction grep et substr

Messagepar Eric Casellas » 20 Mar 2019, 11:25

Bonjour,

Avec la fonction grep (mais pas substr) tu peut utiliser des expressions régulières (https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re) pour pouvoir chercher un motif plutôt qu'une chaîne de caractères fixe

Code : Tout sélectionner

?regex


Sinon pour des cas particuliers il y a des fonction comme startsWith

Code : Tout sélectionner

?startsWith


Eric
Eric

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction grep et substr

Messagepar Anais Payen » 20 Mar 2019, 12:32

Eric Casellas a écrit :Bonjour,

Avec la fonction grep (mais pas substr) tu peut utiliser des expressions régulières (https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re) pour pouvoir chercher un motif plutôt qu'une chaîne de caractères fixe

Code : Tout sélectionner

?regex


Eric


Merci pour votre réponse, mais comme je disais il ne s'agit pas d'un motif fixe donc je ne suis pas certaine que cela correspondrait, sauf si je n'ai pas bien compris le sens de "motif". :)

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

Re: Fonction grep et substr

Messagepar Pierre-Yves Berrard » 20 Mar 2019, 12:43

Bonjour,

Créer une nouvelle variable dans DF2 :

Code : Tout sélectionner

DF2$cip7 <- substr(DF2$drug_source_value, 1, 7)
Puis merge ?

Sous réserve d'avoir bien compris..
PY

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction grep et substr

Messagepar Anais Payen » 20 Mar 2019, 13:03

Pierre-Yves Berrard a écrit :Bonjour,

Créer une nouvelle variable dans DF2 :

Code : Tout sélectionner

DF2$cip7 <- substr(DF2$drug_source_value, 1, 7)

Puis merge ?

Sous réserve d'avoir bien compris..


Ha mais oui! Extraire une chaine de caractère et créer une nouvelle colonne! C'est parfait car cela me permet de chercher les 1500 codes différents!
Merci beaucoup!

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction grep et substr

Messagepar Anais Payen » 10 Mai 2019, 08:37

Bonjour à tous,

Je me permet de relancer ce sujet car je rencontre un problème équivalent, j'ai un df de ce type :

Code : Tout sélectionner

         nir_ano                           libelle       trim_ttt      chron_trim
5787  JW68783BWJDWD         TANGANIL 500 MG Gé CPR 30       T3          0
5801  JW68783BWJDWD         TANGANIL 500 MG Gé CPR 30       T1          1
39610 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30     <NA>          0
38214 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T4          0
39340 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T4          0
38271 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T3          0
38365 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T3          0
39718 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T3          0
38939 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T3          0
38650 JW68783BWJDWD KARDEGIC 75MG PDR ORALE SACHET 30       T2          1


J'ai donc un seul identifiant patient, et je souhaiterai savoir si pour ce un traitement identique, il y a une fois la présence de T1 et T2.
J'avais commencé par ce code

Code : Tout sélectionner

df$chrom_trim <- ifelse(df$trim_ttt %in% c("T1", "T2"), 1,0)

Puis dans mon group_by par patient et libelle, je faisais une somme de ma colonne chron_trim, sauf que je vais avoir un chiffre supérieur à 2 si j'ai plusieurs fois T1 ou T2 or je souhaiterai avoir une valeur supérieure à 2 seulement si T1 et T2 sont apparu au moins une fois chacun.

j'ai ensuite pensé à un grep, mais il va également compter tous mes T1 et tous mes T2 pour un même médicament...

Est ce que quelqu'un aurait une idée? (je ne sais pas si j'ai été très claire...)

Merci d'avance :)

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

Re: Fonction grep et substr

Messagepar Pierre-Yves Berrard » 10 Mai 2019, 08:50

Bonjour,

À première vue, la solution ne repose pas sur grep ni substr, donc il vaudrait mieux créer un nouveau sujet.

Il est par ailleurs plus simple de raisonner dans un premier temps sur un patient et un libellé (ajouter le group_by sera facile par la suite).
Dans le nouveau sujet, préciser pour une suite de Tn (n = 1, 2, 3, ...) quel est le résultat attendu.
PY

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction grep et substr

Messagepar Anais Payen » 10 Mai 2019, 08:59

Il s'agit de vérifier la présence d'une chaine de caractère non?

J'aimerai obtenir 1 si T1 apparait une fois, puis ensuite 0 et de même pour T2

Code : Tout sélectionner

T1   1
T1   0
T1   0
T2   1
T1   0


Merci d'avance

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

Re: Fonction grep et substr

Messagepar Pierre-Yves Berrard » 10 Mai 2019, 09:05

Anais Payen a écrit :Il s'agit de vérifier la présence d'une chaine de caractère non?

Certes, mais grep et substr recherchent/extraient des sous-chaînes à partir d'une chaîne plus grande, ce qui n'est pas le cas ici.
PY

Anais Payen
Messages : 60
Enregistré le : 25 Fév 2019, 08:50

Re: Fonction grep et substr

Messagepar Anais Payen » 10 Mai 2019, 09:14

Pierre-Yves Berrard a écrit :
Anais Payen a écrit :Il s'agit de vérifier la présence d'une chaine de caractère non?

Certes, mais grep et substr recherchent/extraient des sous-chaînes à partir d'une chaîne plus grande, ce qui n'est pas le cas ici.


Oui effectivement, en manipulant la fonction, j'ai compris votre message!

Désolée pour la mauvaise localisation de mon post

Esther Mboyo
Messages : 1
Enregistré le : 04 Fév 2020, 15:05

Re: Fonction grep et substr

Messagepar Esther Mboyo » 04 Fév 2020, 16:00

Bonjour à tous,

Je viens solliciter votre aide pour résoudre un problème qui me coince
J'ai rencontré un problème en utilisant la fonction substr. En effet j'ai voulu récupérer les 2 premiers chiffres des codes postaux afin de pouvoir constituer la liste des départements pour ensuite faire une projection cartographique. Je note également que certains codes postaux n'ont que 4 chiffres (exemple 6100 qui de base devrait être 06100), j'ai un dataframe avec 7163 lignes. Le code est le suivant:

codepost <- rapo$codePostal #je crée un vecteur dans lequel je range tous les codes postaux du dataframe initial
length(codepost) #je revérifie si j'ai bien les 7163 lignes
[1] 7163

for (i in 1:length(codepost))
{
if (length(i) < 5)
{
dep<-substr(codepost[i],0,1) #recupere le 1er char si length est inf a 5
depart<-paste('0',dep,sep="") #rajouter un 0 devant le 1er char
print(depart)
}

else
{
dep<-substr(codepost[i],0,2) #sinon je prend les 2 premiers chiffres si length(i)=5
print(dep)
}
}


Résultat:
[1] "08"
[1] "06"
[1] "05"
[1] "02"
...
...
Je pense que la boucle a fonctionné uniquement pour les codes postaux dont la longueur est inférieure à 5, car elle m'a rajouté que des 0 mais la partie else de ma boucle ne donne aucun résultat.
J'ai essayé de voir la longueur de mon vecteur dep:
length(dep) # j'ai 1 en resultat, je ne comprends pas le pourquoi.
[1] 1

Quelqu'un aurait-il rencontré ce genre de problème auparavant?
Merci de votre aide.

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

Re: Fonction grep et substr

Messagepar Eric Casellas » 04 Fév 2020, 16:17

Bonjour,

A priori dans ton test

Code : Tout sélectionner

if (length(i) < 5)
étant donné la définition de i qui est un simple entier (de 1 à 7163), et donc length(i)=1<5 sera toujours vrai et ainsi en effet tu ne passe jamais dans ton else.
J'imagine que ce que tu veux c'est plutôt regarder la taille de la chaine de charactere du codepost utilisé à ce moment là

Code : Tout sélectionner

if (nchar(codepost[i]) < 5)


Sinon éventuellement pour éviter d'avoir a gérer plusieurs cas tu peut regarder du coté de la fonction str_pad du paquet stringr qui te permet de formater tous tes codepost en forçant le nombre de chiffre présents :

Code : Tout sélectionner

library(stringr);
str_pad(c(1,10,100,1000,10000), 5, pad = "0")


Eric
Eric

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

Re: Fonction grep et substr

Messagepar Serge Rapenne » 04 Fév 2020, 17:12

Bonjour,

pour compléter la réponse d'Éric, la boucle est inutile :

Code : Tout sélectionner

dta<-data.frame(code_postal=c("8500","10253","54123")) #jeu de données exemple
dta
  code_postal
1        8500
2       10253
3       54123
library(stringr)

dta$dpt<-substr(str_pad(dta$code_postal, 5, pad = "0"),1,2)
dta
  code_postal dpt
1        8500  08
2       10253  10
3       54123  54


Serge


Retourner vers « Questions en cours »

Qui est en ligne

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