gestion de chaines de caractères

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

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

gestion de chaines de caractères

Messagepar Couanais Pierre » 14 Oct 2011, 13:59

Bonjour à tous,

J'ai une problématique relativement simple à comprendre mais pas facile à expliquer ni à mettre en œuvre (pour mon niveau de R) sans de multiples boucles.

J'ai un vecteur composé de mots ou d'expression (des centaines de milliers).
ex :
moto
achat moto
jardinage17t56

D'un autre côté j'ai x (une dizaine) d'autres vecteurs composés eux de mots seuls, et pouvant être de taille différente (de 2 à 300 mots).
ex
v1 v2 v3
voiture vente jardin
moto achat

Ce que je souhaite faire : pour CHACUN des mots ou expression du premier vecteur je veux savoir si un mot (au moins) de chacun des autres vecteurs est présent ou non, avec un indicateur par exemple

ex v1 v2 v3
moto 1 0 0
achat moto 1 1 0
jardinage17t56 0 0 1

Je sais que dans le package stringr, la détection d'un motif est possible mais j'aimerais éviter les boucles ou du moins quelequechose de trop lourd.

Si quelqu'un a une idée ...
Merci

Matthieu Lesnoff
Messages : 118
Enregistré le : 29 Nov 2004, 12:41

Re: gestion de chaines de caractères

Messagepar Matthieu Lesnoff » 14 Oct 2011, 18:48

peut être regarder du côté de l'aide de la fonction grep() (?)
ML

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 16 Oct 2011, 08:58

Il doit y avoir plus simple, mais bon...

Code : Tout sélectionner

> v <- c("moto", "achat moto", "jardinage17t56")
>
> v1 <- c("voiture", "moto")
> v2 <- c("vente", "achat")
> v3 <- "jardin"
>
> L <- list(v1 = v1, v2 = v2, v3 = v3)
>
> foo <- function(liste, vecteur){
+     r <- lapply(liste,
+                 function(y){
+                     sapply(y,
+                            function(x){
+                                grepl(pattern = x, x = vecteur)
+                                })
+                 })
+     mat <- t(do.call("rbind", lapply(r, rowSums)))
+     dimnames(mat) <- list(vecteur, names(liste))
+     mat
+     }
>
>
> foo(liste = L, vecteur = v)
               v1 v2 v3
moto            1  0  0
achat moto      1  1  0
jardinage17t56  0  0  1
Renaud

dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Messagepar dicko ahmadou » 17 Oct 2011, 00:07

Bonsoir

Plus simple je ne suis pas très sure mais je serais vraiment curieux de voir ça...en tout cas ton code est très lisible, bon voici ma solution qui utilise le même principe que le tien mais en un peu plus court mais le prix à payer c'est un peu de lisibilité.

En gardant les mêmes variables que celles de Renaud

Code : Tout sélectionner

foo2 <- function(VecteurS, vecteur) {

 L <- sapply(as.list(VecteurS), function(x) grepl(x, vecteur)*1)

  L <- L[ ,apply(L, 2, function(x) any(x > 0))]

   dimnames(L) <- list(vecteur, paste("v", 1:ncol(L), sep = ""))
    L

}

foo2(c(v1, v2, v3), v)

R> foo2(c(v1, v2, v3), v)
               v1 v2 v3
moto            1  0  0
achat moto      1  1  0
jardinage17t56  0  0  1
The best thing about being a statistician is that you get to play in everyone's backyard.
John Tukey

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 17 Oct 2011, 13:38

Merci bien à vous, c'est très rapide et cela fonctionne à priori parfaitement !
La question que je me pose ensuite est la gestion des majuscules : peut on demander à R de ne pas être sensible aux majuscules ?
que moto = Moto = MoTo

Merci

Alexis Thieullen
Messages : 128
Enregistré le : 04 Jan 2011, 12:11

Messagepar Alexis Thieullen » 17 Oct 2011, 13:44

Bonjour,
Il existe une option

Code : Tout sélectionner

ignore.case = TRUE
mais je ne sais pas si elle fonctionne avec toutes les instruction "grep". Donc à essayer.

[EDIT]

Après avoir essayé avec l'exemple de Renaud, ça a l'air de fonctionner en rajoutant le code précédent dans l'instruction "grepl" de la fonction.

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 17 Oct 2011, 14:13

tout à fait je viens d'essayer également, merci beaucoup (mais j'aurais pu/du aller voir l'aide de la fonction grep !!)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité