R- Gestion de string

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

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

R- Gestion de string

Messagepar Le Bihan Hugo » 02 Juil 2020, 08:34

Bonjour,
J'ai un problème, j'aimerai couper un string afin d'avoir les nombres en entier suivi de la phrase qui lui correspond :

Code : Tout sélectionner

x<-"1=OUI 25=NON 123=Je ne sait pas


J'ai réussi a faire cela, mais ce code me supprime le texte entre:

Code : Tout sélectionner

> str_split(x, pattern = "[^0-9]")
[[1]]
 [1] "1"   ""    ""    ""    ""    "25"  ""    ""    ""    ""    "123" ""    ""    ""    ""    ""    ""    ""    ""    ""    "" 


Ce que j''aimerai obtenir :

Code : Tout sélectionner

"1" "=OUI" "25" "=NON "123" "=Je ne sais pas"


Je pense qu'il existe une solution avec les expressions régulières, mais je suis novice et j'ai du mal à comprendre.

Si quelqu'un pouvait m'aider merci.

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

Re: R- Gestion de string

Messagepar Mickael Canouil » 02 Juil 2020, 09:23

Bonjour,

pour vos prochains messages, pensez à écrire un code reproductible et fonctionnel.
Ici, la chaîne de caractère dans x, n'a pas le guillemet fermant la dite chaîne et aucune indication sur la provenance de str_split() n'est fournie.

Code : Tout sélectionner

<- "1=OUI 25=NON 123=Je ne sait pas"
str_split(x, pattern = "[^0-9]")
#> Error in str_split(x, pattern = "[^0-9]"): could not find function "str_split"        

Ceci étant dit, comme vous utilisez (a priori) la librairie stringr, voici une solution

Code : Tout sélectionner

library("stringr")
<- "1=OUI 25=NON 123=Je ne sait pas"
str_extract_all(string = x, pattern = "[0-9]+=[^0-9]+")
#> [[1]]
#> [1] "1=OUI "             "25=NON "            "123=Je ne sait pas"   

EDIT : En R base

Code : Tout sélectionner

<- "1=OUI 25=NON 123=Je ne sait pas"
regmatches(x, gregexpr("[0-9]+=[^0-9]+", x))
#> [[1]]
#> [1] "1=OUI "             "25=NON "            "123=Je ne sait pas"   

Pour en savoir plus sur les expressions régulières ?regex dans R ou n'importe quelle ressource en ligne.

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

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

Re: R- Gestion de string

Messagepar Le Bihan Hugo » 02 Juil 2020, 09:31

Très bien je prend note !
Merci pour votre aide., je pense que j'arriverai à me débrouiller avec.

Cordialement,
Hugo

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

Re: R- Gestion de string

Messagepar Logez Maxime » 03 Juil 2020, 07:54

Bonjour,

une alternative avec les fonctions de base :

Code : Tout sélectionner

strsplit(x, "(?<=\\D) (?=\\d)", perl = T)

Cordialement,
Maxime

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

Re: R- Gestion de string

Messagepar Mickael Canouil » 03 Juil 2020, 13:11

Logez Maxime a écrit :Bonjour,

une alternative avec les fonctions de base :

Code : Tout sélectionner

strsplit(x, "(?<=\\D) (?=\\d)", perl = T)

Cordialement,
Maxime

Il faudrait vraiment que je me penche sur cette syntaxe des expressions régulières pour les éléments répétés.
Mickaël
mickael.canouil.fr | rlille.fr

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

Re: R- Gestion de string

Messagepar Le Bihan Hugo » 03 Juil 2020, 14:16

Bonjour,

Tout d'abord merci Mickael, ton code ma beaucoup aidé !

J'ai un nouveau problème toujours avec les expressions régulières,

Code : Tout sélectionner

library("stringr")
x<-"121~52~2"
> str_extract_all(string = x,pattern = "\\d+(?=~)")
[[1]]
[1] "121" "52"


Je ne sais pas pourquoi il supprime le 2 à la fin j'aimerai obtenir "121" "52 "2"

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

Re: R- Gestion de string

Messagepar Mickael Canouil » 03 Juil 2020, 14:48

Tout simplement parce-que vous indiquez que chaque nombre doit obligatoirement être suivi de ~.
2 ne respecte donc pas votre expression.
Voir "*" et "+".

Code : Tout sélectionner

library("stringr")
<- "121~52~2"
str_extract_all(string xpattern "\\d+(?=~*)")
#> [[1]]
#> [1] "121" "52"  "2" 
Mickaël
mickael.canouil.fr | rlille.fr

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

Re: R- Gestion de string

Messagepar Le Bihan Hugo » 03 Juil 2020, 14:51

Mickael Canouil a écrit :Tout simplement parce-que vous indiquez que chaque nombre doit obligatoirement être suivi de ~.
2 ne respecte donc pas votre expression.
Voir "*" et "+".

Code : Tout sélectionner

library("stringr")
<- "121~52~2"
str_extract_all(string = x, pattern = "\\d+(?=~*)")
#> [[1]]
#> [1] "121" "52"  "2"  


Ah! J'avais bien vu que je pouvais utiliser "*" ou "+" mais j'ai remplacé le "?" au lieu de l'ajouter après le "~"
Merci.

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

Re: R- Gestion de string

Messagepar Le Bihan Hugo » 03 Juil 2020, 15:00

Code : Tout sélectionner

library("stringr")
x<-"7,6~9,8,7"
> str_extract_all(string = x,pattern = "\\d+(?=~*)")
[[1]]
[1] "7" "6" "9" "8" "7"


Ce code fonctionne parfaitement sans "," mais avec il me sépare tous mes caractères

Dans ce cas j'aurai voulu obtenir "7,6" "9,8,7"

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: R- Gestion de string

Messagepar Fred Santos » 03 Juil 2020, 15:41

Ce n'est plus la même question là ;-)
Mais ceci devrait marcher :

Code : Tout sélectionner

str_extract_all(string = x, pattern = "[[:digit:],]+(?=~*)")

(Je remplace vos \d par le classique [:digit:] que je trouve moins ambigu.)

Le Bihan Hugo
Messages : 7
Enregistré le : 26 Juin 2020, 13:22

Re: R- Gestion de string

Messagepar Le Bihan Hugo » 03 Juil 2020, 15:53

C'est parfait, merci !

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

Re: R- Gestion de string

Messagepar Logez Maxime » 03 Juil 2020, 20:19

Le Bihan Hugo a écrit :

Code : Tout sélectionner

library("stringr")
x<-"7,6~9,8,7"
> str_extract_all(string = x,pattern = "\\d+(?=~*)")
[[1]]
[1] "7" "6" "9" "8" "7"


Ce code fonctionne parfaitement sans "," mais avec il me sépare tous mes caractères

Dans ce cas j'aurai voulu obtenir "7,6" "9,8,7"
Dans des cas comme celui-là ou le séparateur est clair, qu'il ne peut pas être confondu avec le texte qu'on cherche à conserver alors la fonction strplit est toute adaptée et plus simple à mettre en place que de chercher la bonne expression régulière.

Code : Tout sélectionner

strsplit(x", "~")
[[1]]
[1] "7,6"   "9,8,7"

str_extract_all(string = x, pattern = "[[:digit:],]+(?=~*)")
[[1]]
[1] "7,6"   "9,8,7"

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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