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:
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:
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