Inclusion vecteur dans matrice ?

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

jonathan vitrou
Messages : 44
Enregistré le : 25 Aoû 2008, 13:03

Inclusion vecteur dans matrice ?

Messagepar jonathan vitrou » 13 Fév 2009, 15:48

Bonjour a tous,

J'ai une petite question, en gros c'est pas bien complique a expliquer (certainement a resoudre non plus mais la je trouve pas).
J'ai une matrice par exemple :
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10

Et un vecteur :
1 2

Je veux en fait retrouver les lignes de la matrice qui sont egales au vecteur mais je ne trouve pas la bonne condition.
J'ai essaye ceci :
m[,]==v

Mais le resultat :
[,1] [,2]
[1,] TRUE TRUE
[2,] FALSE FALSE
[3,] FALSE FALSE
[4,] FALSE FALSE
[5,] FALSE FALSE
ne me convient pas trop car je ne voudrais pas tester element a element mais avoir l'egalite ligne par ligne et donc obtenir le resultat suivant
TRUE
FALSE
FALSE
FALSE
FALSE

Une idee ? Merci d'avance

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

Messagepar Eric Casellas » 13 Fév 2009, 16:31

Peut être une piste en utilisant all.equal() plutôt que == pour tester l'égalité ?
Eric

jonathan vitrou
Messages : 44
Enregistré le : 25 Aoû 2008, 13:03

Messagepar jonathan vitrou » 13 Fév 2009, 17:15

Merci de ta reponse mais pour tester ce que je souhaite cela ne semble pas adaptable.

Je veux en fait pouvoir tester pour la matrice ligne a ligne si on a egalite avec le vecteur.
La solution a laquelle j'avais pense etait de creer une nouvelle matrice ou chaque ligne serait egale au vecteur que l'on veut tester. Cependant je n'arrive ensuite pas a trouver la methode adequate pour realiser mon test.

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

Messagepar Logez Maxime » 13 Fév 2009, 17:30

Bonjour,

Code : Tout sélectionner

apply(X, 1,function(x) all(abs(x-c(1,2))<1e-7)) #X ta matrice


Voir aussi avec la fonction match.

Maxime

jonathan vitrou
Messages : 44
Enregistré le : 25 Aoû 2008, 13:03

Messagepar jonathan vitrou » 16 Fév 2009, 10:11

Merci ta solution me semble bonne mais j'ai quand meme un souci en la testant.

Je tape les lignes de codes suivantes :
a=matrix(c(1,2,3,4,1,2,4,5,3,4),5,2,byrow=TRUE)
resu=apply(a,1,function(x) all(abs(a-a[1,])<1e-7))

Je devrais donc au moins avoir la premiere ligne a TRUE (puisque que je compare ligne a ligne par rapport a la premiere ligne de la matrice et pourtant le resultat est le suivant


> resu
[1] FALSE FALSE FALSE FALSE FALSE

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

Messagepar Logez Maxime » 16 Fév 2009, 12:44

Re,

le problème vient de ton code. Dans le apply tu lui dis d'appliquer une fonction qui dépend de x 'function(x)' mais à la droite de cette fonction tu ne te sers pas de cet argument mais de a 'all(abs(a-a[1,])<1e-7)', donc a chaque ligne il va comparer non pas la ligne mais la matrice a tout entier avec la première ligne de a. Tu pourrais avoir 100000 lignes tu aurais toujours le même résultat parce que tu reproduis le même calcul à chaque ligne :

Code : Tout sélectionner

z <- matrix(rep(c(1,2),each=1000),ncol=2)
table(apply(z,1,function(x) all(abs(z-z[1,])<1e-7))) ### 1000 fois FALSE alors que tout les lignes sont égales à la première ...

table(apply(z,1,function(x) all(abs(x-z[1,])<1e-7))) # la tu as 1000 fois TRUE


Le x de function(x) va être remplacer par les valeurs de ta ligne. Dans ta fonction le x va être remplacer par la valeur de cet argument : quand tu fais mean(de quelque chose) c'est comme si tu faisais mean(x=quelque chose), x va prendre au sein de ta fonction les valeurs que tu auras spécifier en argument. Si tu écris function(x) all(z-2<0) comme z n'est pas spécifié dans les argument de ta fonction, alors la fonction va chercher une valeur de z ailleurs que dans ta fonction, en l'occurrence dans l'environnement supérieur et s'il trouve une valeur alors il s'en servira. C'est exactement ce qui est arrivé ici. Dans ta fonction tu ne définis pas de z, donc il va chercher une valeur de z dans l'environnement supérieur (ici dans l'environnement global). Et tu répètes ça pour chaque ligne parce que à chaque fois aucune valeur de z n'est spécifier dans les argument de ta fonction.


En espérant que ça soit plus clair.

Maxime

P.S : pour mieux te rendre compte de ce qui se passe dans le apply :

Code : Tout sélectionner

[[1]]
FUN(E = newX[, i])

[[2]]
FUN(E = newX[, i])


FUN sera remplacer par la fonction que tu utiliseras, et à chaque ligne tu vas faire FUN(E=valeur de la ligne). Dons si dans ta fonction tu n'utilises pas E mais F il va aller chercher F ailleurs.


Retourner vers « Questions en cours »

Qui est en ligne

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