2017-10-14 11 views
0

J'ai un dataframe avec des données mensuelles month sur le parasitisme herbivore result pour différents types d'ordre parasitoïde « de psitorder » avec des niveaux « hyménoptères » ou « diptères » . Le résultat est soit "p" pour un herbivore parasité, "a" si l'herbivore est devenu adulte, soit il n'y a pas de données "" parce que l'herbivore est mort en captivité.arguments de regroupement dans tidyverse: Bin par nombre consécutif de niveaux dans une variable avec des niveaux manquants

df<-data.frame(month= c(rep(1, each=8), rep(2, each=6), 
        rep(3, each=6), rep(4, each=8), 
        rep(5,each=6),rep(6, each=6), 
        rep(8,each=6),rep(9, each=6)), 
       result= c(rep("p",each=3),rep("a",each=3), 
        rep("",each=2),rep("p",each=3),rep("a",each=2), 
        rep("",each=1),rep("a",each=3),rep("",each=3), 
        rep("p",each=3),rep("a",each=3),rep("",each=2), 
        rep("p",each=3),rep("a",each=2), 
        rep("",each=1),rep("a",each=3),rep("",each=3), 
        rep("p",each=3),rep("a",each=3),rep("",each=2),   
        rep("a",each=4)), 
       psitorder=c(rep("Hymenoptera",each=2), 
        rep("Diptera",each=1),rep("",each=5), 
        rep("Hymenoptera",each=1),rep("Diptera",each=3), 
        rep("",each=2),rep("",each=6), 
        rep("Hymenoptera",each=2),rep("Diptera",each=1), 
        rep("",each=5),rep("Hymenoptera",each=1), 
        rep("Diptera",each=3),rep("",each=2), 
        rep("",each=6),rep("Hymenoptera",each=2), 
        rep("Diptera",each=1),rep("",each=9))) 

Je voudrais groupe par la variable month, cependant, je dois groupe par tous les 3 mois consécutifs de données. Ici, dans cet exemple, month 1,2,3 serait groupé et mois 4,5,6, et pour le mois 7,9, je devrais ajouter le mois manquant 8 de sorte que les lignes consécutives continuent d'être utilisées pour calculer psit_freq.

Une fois groupé, je veux calculer psit_freq en utilisant la méthode ci-dessous.

J'ai essayé:

output %>% 
group_by(month+3) %>% 
mutate(complete(continuous_month= seq(min(continuous_month), 
max(continuous_month), 1L))%>% 
summarise(hym_freq = sum(psitorder == 'Hymenoptera')/sum(result %in% c('p', 'a')), 
      dip_freq = sum(psitorder == 'Diptera')/sum(result %in% c('p', 'a'))) 

La sortie ressemblerait à ceci:

output<- data.frame(group= c("1", "2", "3"), hym_psit= c(3/14, 
     3/14,2/10), dip_psit= c(4/14,4/14,1/10)) 

Répondre

0

Nous créons une variable de regroupement avec %/%

data_frame(month = 1:9) %>% 
     full_join(., df) %>% 
     group_by(group = (month-1)%/%3 + 1) %>% 
     summarise(hym_freq = sum(psitorder == 'Hymenoptera', na.rm = TRUE)/sum(result %in% c('p', 'a'), na.rm = TRUE), 
      dip_freq = sum(psitorder == 'Diptera', na.rm =TRUE)/sum(result %in% c('p', 'a'), na.rm = TRUE)) 
# A tibble: 3 x 3 
# group hym_freq dip_freq  
# <dbl>  <dbl>  <dbl> 
#1  1 0.2142857 0.2857143 
#2  2 0.2142857 0.2857143 
#3  3 0.2000000 0.1000000