汇总计数数据并返回R中因子的最高水平

时间:2018-09-19 00:04:17

标签: r dplyr

我对R很陌生,我有一个数据框,其中包含在各个站点检测到的单个鸟类的计数以及每个个体的繁殖证据(有序因素)。看起来像这样:

station<-c('stn1','stn1','stn1','stn1','stn1','stn2','stn2')
species<-c('PBGR','PBGR','SORA','SORA','SORA','LCSP','SORA')
interval1<-c(0,0,1,1,0,1,0)
interval2<-c(1,1,0,0,1,0,1)
breeding.evidence<-c('A','A','S','S','D','S','S')
breeding.evidence<-factor(breeding.evidence,levels=c('S','D','A'))

df<-data.frame(station,species,interval1,interval2,breeding.evidence)

>df
  station species interval1 interval2 breeding.evidence
1    stn1    PBGR         0         1                 A
2    stn1    PBGR         0         1                 S
3    stn1    SORA         1         0                 S
4    stn1    SORA         1         0                 S
5    stn1    SORA         0         1                 D
6    stn2    LCSP         1         0                 S
7    stn2    SORA         0         1                 S

就这样,每一行代表一个人。我想总结一下数据框,为同一物种的记录添加interval1和interval2,并选择最高的繁殖证据。到目前为止,我有:

library(dplyr)

df%>%
group_by(station,species)%>%
summarise_at(vars(interval1:interval2),sum)

可以工作并返回

  station species interval1 interval2 
1    stn1    PBGR         0         2 
2    stn1    SORA         2         1                 
3    stn2    LCSP         1         0 
4    stn2    SORA         0         1 

但是我丢失了繁殖证据,并尝试尝试无法确定哪种代码有效。我最后想要的是:

  station species interval1 interval2  breeding.evidence
1    stn1    PBGR         0         2                  A
2    stn1    SORA         2         1                  D       
3    stn2    LCSP         1         0                  S
4    stn2    SORA         0         1                  S

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

也许您可以定义另一个变量来设置breeding.evidence的顺序,如下所示。

df <- df %>%
  mutate(ind = case_when(breeding.evidence == "A"~1L,
                         breeding.evidence == "D"~2L,
                         breeding.evidence == "S"~3L,
                         TRUE~NA_integer_))

然后,您可以将第一个摘要与来自同一数据集的另一个摘要合并,并在按该排序变量(first)排列后取breeding.evidence ind

df%>%
  group_by(station,species)%>%
  summarise_at(vars(interval1:interval2),sum) %>%
  left_join(df %>%
              group_by(station, species) %>%
              arrange(ind) %>%
              summarise_at(vars(breeding.evidence), funs(first)))

输出

# A tibble: 4 x 5
# Groups:   station [?]
  station species interval1 interval2 breeding.evidence
  <fct>   <fct>       <dbl>     <dbl> <fct>            
1 stn1    PBGR            0         2 A                
2 stn1    SORA            2         1 D                
3 stn2    LCSP            1         0 S                
4 stn2    SORA            0         1 S