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 :

Imbrication boucles for/ if/ while ne fonctionne pas


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Imbrication boucles for/ if/ while ne fonctionne pas
    Bonjour,

    J'étudie la néophobie chez des oiseaux. Je manipule un jeu de données temporel.
    Pour un "area" (bois) et un "box" (nichoir) donné, chaque ligne donne une information sur un comportement, sa durée et son auteur.
    La séquence d' événements pour chaque oiseau (i.e. pour chaque combinaison de "area"/ "box") est START ... AO.......AO.........END
    "START" correspond au lancement de la vidéo et "END" à la fin. "AO" signifie que l'on change d'expérience au cours de la vidéo.

    Voici un extrait de mon jeu de données "neo"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    > neo
         area    box     date     time timeinsec total.time identity behaviour  
    1    BS   BS 25C 19/06/14    1         0          1     <NA>       START    
    2    BS   BS 25C 19/06/14    1         0          1       HB         D1A1     
    3    BS   BS 25C 19/06/14    2        12          2     <NA>        AO    
    4    BS   BS 25C 19/06/14    2        12          2       HB         D2A1     
    5    BS   BS 25C 19/06/14    3        23          3     <NA>       DO     
    6    BS   BS 25C 19/06/14    4        25          4       HB         D1A2     
    7    BS   BS 25C 19/06/14    5        29          5       HB          F1A     
    8    BS   BS 25C 19/06/14   11      3876          6     <NA>      AO     
    9    BS   BS 25C 19/06/14   12      3894          7     <NA>      DO    
    10   BS  BS 25C 19/06/14   13      5205          8        M         DV     
    11   BS  BS 25C 19/06/14   14      5207          9        M         FV     
    12   BS  BS 25C 19/06/14   15      5214         10       HB        AP     
    13   BS  BS 25C 19/06/14    6      7761         11       HB         AP    
    14   BS  BS 25C 19/06/14    7      7779         12        M          P     
    15   BS  BS 25C 19/06/14    8      7866         13        F           S    
    16   BS  BS 25C 19/06/14    9      7946         14       HB       D1A1     
    17   BS  BS 25C 19/06/14   10      7966         15       HB       F1A     
    18   BS  BS 25C 19/06/14   10      7966         15     <NA>     END
    Mon jeu de données réel contient ce type de séquence N fois soit une séquence par combinaison de area/box.
    Les séquences sont les unes à la suite des autres donc un "END" est toujours immédiatement suivi d'un "START".

    Je voudrais que R me construise "status" un vecteur colonne dans lequel il inscrit "remove" lorsque nous nous trouvons à des lignes entre START et AO, puis "control" lorsque nous sommes entre 2 AO et enfin "fig" lorsque nous sommes entre le deuxième AO et END. Et répéter ceci pour chacune des séquences bien sûr.

    J'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    status = NULL
     
    for (i in 1:nrow(neo)){   # pour tester toutes les lignes de mon jeu de données
     
        if(behaviour[i] == "START"){
            j = i
            while(behaviour[j] != "AO"){
                status[j] = "remove"
                j = j+1
     
            }
     
        }
     
     
        if((behaviour[i] == "AO") & (status[i-1] == "remove")) { # expérience 1
            j = i
            while(behaviour[j] != "AO"){
                status[j] = "control"
                j = j+1
            }
        }
     
        if((behaviour[i] == "AO") & (status[i-1] == "control")) { # expérience 2
            j = i
            while(behaviour[j] != "END"){
                status[j] = "fig"
                j = j+1
            }
        }
    }
    Or il me renvoie le message d'erreur suivant:

    Error in while (behaviour[j] != "AO") { :
    valeur manquante là où TRUE / FALSE est requis

    Ou bien:

    Error in if ((behaviour[i] == "AO") & (status[i - 1] == "remove")) { :
    l'argument est de longueur nulle

    Ce qui me fait penser qu'il n'enchaîne pas les boucles dans l'ordre suivant: for / 1er if/while/ 2ieme if/while/ 3ieme if /while /for etc...

    De plus, "status" ne semble pas se remplir au fur et à mesure car il garde sa valeur NULL.

    J'ai également tenté en remplaçant mes deux derniers if par else if mais cela ne fonctionne pas.

    A la fin j'ajouterai la colonne "status" à la matrice "neo" avec neo=data.frame(neo, status).
    J'ai également essayé en créant la colonne "status" (remplie de NA) dans ma matrice "neo" avant de lancer la boucle mais cela ne fonctionne pas davantage.

    Pouvez-vous m'aider svp?

    Hélène

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Hello,


    Si tu codes en numeric l'evenement behaviour= AO, alors en faisant un cumsum sur chaque sequence tu peux visualiser à chaque ligne le nombre de AO depuis le start de la sequence.
    0-> remove, 1->control, 2 ou + -> fig

    Pas eu le temps de tester le code, mais dans l'esprit c'est ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    neo<-neo[order(paste(neo$area,neo$box)),]
    neo$status<-unlist(tapply(paste(neo$area,neo$box),as.numeric(neo$behaviour=="AO"),cumsum))
     
    neo$statusQuali<-"remove"
    neo$statusQuali[neo$status==1]<-"control"
    neo$statusQuali[neo$status>1]<-"fig"

    PS : en R, jamais de boucle pour parcourir les lignes d'un data frame

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour!

    C'est génial ça fonctionne!! Merci!!
    Je n'avais pas pensé à faire ça du tout... Je sais bien qu'il faut éviter les boucles et préconiser les fonctions apply, sapply et tapply mais étant débutante sous R je ne les avais encore jamais utilisées!

    Par contre pour que cela fonctionne vraiment il faut inverser ton paste(neo$area,neo$box) avec as.numeric(neo$behaviour=="AO")


    et donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    neo$status<-unlist(tapply(as.numeric(neo$behaviour=="AO"),paste(neo$area,neo$box),cumsum))
    Car j'ai lu que dans une fonction "tapply" le premier argument spécifie un vecteur numérique sur lequel on veut appliquer la fonction, le second spécifie la façon dont ce vecteur sera divisé en groupes, et le troisième spécifie la fonction qui sera appliquée à ces groupes.

    En tout cas je te remercie vivement de m'avoir aidé! Et promis je ne ne recommencerai plus ce genre de boucles

    Hélène

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle For et While
    Par mairou dans le forum Débuter
    Réponses: 6
    Dernier message: 20/09/2008, 20h33
  2. boucle if-then qui ne fonctionne pas
    Par les4c77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/09/2007, 16h24
  3. un For Each qui ne fonctionne pas avec une collection maison !
    Par grenouillesiverte dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/09/2007, 21h00
  4. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55
  5. boucle While ne fonctionne pas ?
    Par beegees dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2006, 20h19

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