IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

problème boucle for


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut problème boucle for
    Bonjour à tous,

    J'ai un problème avec ma boucle for + boucle of qui parcours une matrice.
    J'ai une matrice du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > mat
                  m          n
    [1,] -3.6989596  1.1571740
    [2,] -0.4700084  1.1571740
    [3,]  0.2969587  0.2198091
    [4,]  0.3898892 -4.7359769
    [5,]  5.2133679 -2.6597122
    et je voudrais que si pour chaque ligne, la valeur des deux colonnes en valeur absolue est superieur à deux, alors je garde la ligne, sinon je ne la garde pas. J'ai donc creer une matrice, que je rempli si les conditions sont remplies, sinon, non de cette facon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c <- matrix(data = NA, nrow = 5, ncol = 2)
     
    	for(i in 1 :nrow(mat))
    		{
    		if(abs(mat[i,1])>2 && abs(mat[i,2])>2) 
    			c[i,1]<-mat[i,1] 
    			c[i,2]<-mat[i,2]
    		}
    Mais ca ne fonctionne pas, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
             [,1]       [,2]
    [1,]       NA  1.1571740
    [2,]       NA  1.1571740
    [3,]       NA  0.2198091
    [4,]       NA -4.7359769
    [5,] 5.213368 -2.6597122
    quelqu'un pourrait me dire d'où mon erreur vient ?

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut
    Bonjour.

    Je n'ai pas testé sur mon PC mais selon moi, le problème pourrait venir du fait que tu ne défini pas (à l'aide d'accolades) les actions à faire dans le cas ou les conditions de ton if sont respectées.
    Du coup, J'ai l'impression que si les conditions sont respectées, la première colonne ne sera pas collée dans ta matrice c, mais la deuxième le sera quand même.
    Dans ton exemple, tu n'est sensé conserver que la dernière ligne, et tu as donc bien quatre cellules vides pour la premère colonne, mais bien 4 cellules remplies pour la secondes.
    De plus, la matrice c que tu crée sera de même taille que ta matrice de départ, c'est à dire que tu aura une matrice vide sauf pour les lignes ou les conditions sont remplies, est-ce ce que tu cherches?
    Voici un petit code qui pourrait, je pense, régler ton problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    c <- matrix(data = NA, nrow = 5, ncol = 2)
     
    for(i in 1 :nrow(mat))
    {
    	if(abs(mat[i,1])>2 && abs(mat[i,2])>2)
            {
    			c[i,]<-mat[i,]
    	}
    }
    Dans le cas ou la matrice C contient des NA pour les lignes ou les conditions ne sont pas remplies. Si tu veux supprimer ces lignes, je te conseille d'ajouter un compteur de ligne du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    c <- matrix(data = NA, nrow = 5, ncol = 2)
    ligne=1
    for(i in 1 :nrow(mat))
    {
    	if(abs(mat[i,1])>2 && abs(mat[i,2])>2)
            {
    			c[ligne,]<-mat[i,]
                            ligne=ligne+1
    	}
    }
    ligne <- NULL
    En rajoutant à la fin une commande pour supprimer les lignes de c non remplies par ta fonction (la différence entre ligne et nrow(mat)).
    Voila, je ne suis pas garanti du résultat, mais ça devrait marcher je pense.

    Cordialement.

  3. #3
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Par défaut
    Salut
    Je pense que tu l'as lu quelque part ou entendu, mais quand on travaille avec R il faut éviter tant que possible les boucles, et préferer la vectorisation des calculs.
    En faisant ça, tu gagne en rapidité (pas toujours mais assez souvent), et le code est plus élégant et simple.
    Dans ton cas précis, avoir chaque élément de la colonne supérieure à deux tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    mat[abs(mat[,1])>2 & abs(mat[,2])>2, ]
     
    # mais je te conseille d'utiliser l'argument drop = FALSE pour conserver la structure de matrix
    # au cas ou tu n'as qu'une ligne qui respecte ta condition
     
    mat[abs(mat[,1])>2 & abs(mat[,2])>2, , drop = FALSE]
    Tu comprendras que je n'ai pas envie de voir ce qui cloche dans ta boucle, parce que on est dans R et tu peux t'en passer.

Discussions similaires

  1. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo