sélectionner une partie d'une chaine de caractère

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

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

sélectionner une partie d'une chaine de caractère

Messagepar Florian Sorin » 20 Aoû 2008, 11:22

Bonjour,

J'effectue une afc sur une table de contingence sites/espèces. J'affiche ensuite le résultat sous forme graphique mais c'est illisible en raison du grand nombre d'espèces.
Pour y remédier je voudrais raccourcir les étiquettes affichant les noms des espèces sur le graphique en sélectionnant les trois premières lettre de chaque "mot" (genre, espèce, voire sous-espèce).
Y a-t-il un moyen de sélectionner des fragments de chaine de caractère? Peut-être en utilisant une expression régulière, est-ce possible sous R?

Merci d'avance.

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

Messagepar Logez Maxime » 20 Aoû 2008, 11:31

Bonjour,

si tu ne cherches à avoir que les trois premières lettres de ton mot alors pas besoin de passer par une expression régulière la fonction substring suffit :

Code : Tout sélectionner

x <- c("abaabd","sdfzjfgh","hjkhkjhkjh")
substring(x,1,3)

# une des possibilités avec les expressions régulières :
gsub("(^.{3})(.*$)","\\1",x)
gsub("(?<=^.{3})(.*$)","",x,perl=TRUE)


Maxime

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 20 Aoû 2008, 11:51

Merci pour votre réponse, en fait je cherche à récupérer les trois premières lettres de chaque mot de la chaine de caractère.

Par exemple pour la chaine "genre espèce", je voudrais obtenir "gen esp", et pour la chaine "genre espèce sous-espèce" je souhaite récupérer "gen esp sou". Je ne pense pas que ce soit possible avec substring.

Eric Pagot
Messages : 195
Enregistré le : 15 Fév 2007, 17:10

Messagepar Eric Pagot » 20 Aoû 2008, 12:09

Une solution possible :
chaine<-"genre espèce sous-espèce"
paste(substr(unlist(strsplit(chaine," ")),1,3),collapse=" ")
Vétérinaire CTPA

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

Messagepar Logez Maxime » 20 Aoû 2008, 13:37

Re,

je n'avais pas tout saisi, avec une expression régulière ça donne ceci :

Code : Tout sélectionner

x <- c("zhgfgzj czsfjzeiof","qsffhzdf zfuiu","qsfjifj sfdujf")
gsub("(?<=\\w{3})(-*\\w+)","",x,perl=TRUE)


Maxime

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 20 Aoû 2008, 15:32

Merci pour vos réponses, je n'ai que l'embarras du choix.

J'essaie quand même de comprendre l'expression régulière avant de l'utiliser.

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

Messagepar Logez Maxime » 21 Aoû 2008, 05:55

Re,

le code (?<=\\w{3}) veut dire qu'avant la chaîne de caractère il faut qu'il y est exactement 3 lettres (aussi bien en majuscule qu'en minuscule). En détail la commande (?<=...) veut dire qui existe avant la chaîne de caractères, taille fixée et \\w{3} veut dire trois lettres.
le code (-*\\w+) veut dire que tu cherches une chaîne de caractères qui commence par un "-" ou non, "*" voulant dire 0 ou plus; suivit d'au moins une lettre, "+" voulant dire 1 ou plus.
Donc en résumé tu cherches toutes les chaînes de caractères précédées de trois lettres, composées de lettres et qui commencent ou non par un "-". et au final tu les remplaces par rien.

En espérant que ça t'ai aidé.

Maxime

Pierre Casadebaig
Messages : 67
Enregistré le : 07 Déc 2006, 12:31

Messagepar Pierre Casadebaig » 21 Aoû 2008, 07:29

Je n'ai pas de besoin de cette fonction de sélection précise, mais alors je suis toujours complètement impressionné par les gens qui connaissent les expression régulières ! une sorte de savoir perdu, je trouve... :°) Bravo Maxime !

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 22 Aoû 2008, 07:23

Merci Maxime pour ces explications.


Retourner vers « Questions en cours »

Qui est en ligne

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