Je m'interroge sur le comportement de filter (package dplyr) au sein d'une boucle.
Voici une boucle.
Partant d'un fichier de généalogie (BAR11) contenant des dates de naissance (dnais), je cherche à compter le nombre de pères (p) et de mères (m) représentés parmi les animaux nés un jour donné :
Code : Tout sélectionner
i p m sexe dnais IDANI IDPERE IDMERE F GEN annee
1 179 4 53 2 14/04/2016 GRI2016154875 GRI2015284632 GRI2015285783 0 1 2016
2 180 4 10 2 14/04/2016 GRI2016154879 GRI2015284632 GRI2015284760 0 1 2016
3 181 42 51 2 14/04/2016 GRI2016154956 GRI2015285653 GRI2015285761 0 1 2016
4 182 14 26 2 14/04/2016 GRI2016154997 GRI2015285269 GRI2015285449 0 1 2016
5 183 14 26 2 14/04/2016 GRI2016154999 GRI2015285269 GRI2015285449 0 1 2016
6 184 14 26 2 14/04/2016 GRI2016155000 GRI2015285269 GRI2015285449 0 1 2016
Code : Tout sélectionner
library(tidyverse)
library(lubridate)
for (i in unique(BAR11$dnais)) {
tmp<- BAR11 %>% filter(dnais == i)
# tmp<-BAR11[BAR11$dnais==i,]
head(tmp)
npere <-length(unique(tmp$p))
nmere <-length(unique(tmp$m))
cat(" DNAIS =",i,"N =",nrow(tmp)," # PERES = ",npere," # MERES =",nmere," Fmoy =",mean(tmp$F),"\n")
}
Dans l'état actuel cela me donne :
Code : Tout sélectionner
DNAIS = 04/04/2016 N = 0 # PERES = 0 # MERES = 0 Fmoy = NaN
DNAIS = 14/04/2016 N = 0 # PERES = 0 # MERES = 0 Fmoy = NaN
DNAIS = 16/08/2016 N = 0 # PERES = 0 # MERES = 0 Fmoy = NaN
DNAIS = 25/08/2016 N = 0 # PERES = 0 # MERES = 0 Fmoy = NaN
...
Si, au lieu d'utiliser filter, j'utilise l'instruction classique (tmp<-BAR11[BAR11$dnais==i,]) j'obtiens la bonne réponse :
Code : Tout sélectionner
DNAIS = 04/04/2016 N = 33 # PERES = 20 # MERES = 30 Fmoy = 0
DNAIS = 14/04/2016 N = 10 # PERES = 5 # MERES = 7 Fmoy = 0
DNAIS = 16/08/2016 N = 35 # PERES = 23 # MERES = 26 Fmoy = 0
DNAIS = 25/08/2016 N = 27 # PERES = 18 # MERES = 22 Fmoy = 0
Du coup je me demande qui pourrait m'expliquer pourquoi filter fonctionne ainsi
Je précise que si je tape (hors la boucle for) :
Code : Tout sélectionner
tmp<-BAR11 %>% filter(dnais=="14/04/2016")
j'obtiens bien un tableau de 10 lignes.
Puisque j'y suis, pourquoi ne vois-je pas le résultat du head(tmp) dans la boucle ?
Merci.
Hervé