首页 文章

使用dplyr总结不同因素的运行总数

提问于
浏览
1

我正在尝试为相机陷印调查生成物种饱和度曲线 . 我有成千上万的观察,并在dplyr中完成了大部分操作 .

我有三个野外地点,观察记录不同的动物物种,从几周的诱捕 . 在某些星期没有动物,在其他几周可能有不止一个物种 . 我想为每个站点生成一个单独的数字,以比较在研究的连续几周内遇到的新物种的速度 . 一旦物种多样性在该地区被捕获,这些对新物种的观察最终应该饱和 . 一些野外场地可能比其他场地更快地饱和 .

问题是我没有遇到过计算不同物种数量的方法,以便按时间提供总计 . 下面是一个简单的虚拟数据集 .

field_site<-c(rep("A",4),rep("B",4),rep("C",4))
week<-c(1,2,2,3,2,3,4,4,1,2,3,4)
animal<-c("dog","dog","cat","rabbit","dog","dog","dog","rabbit","cat","cat","rabbit","dog")
df<-as.data.frame(cbind(field_site,week,animal),head=TRUE)

我可以很容易地在每周分组中产生独特物种的数量,例如

tbl_df(df)%>%
  group_by(field_site,week) %>%
  summarise(no_of_sp=n_distinct(animal))

但这对于随后几周再次遇到某些物种的事实并不敏感 . 我真正需要的是不同物种的运行计数,从第1周开始计算每个站点的独特物种数量,假设数据按照从调查开始的增加时间排序 .

在场地A的示例中,在一周中研究过程中遇到的物种的累积总数将是:第1周= 1种,第2周= 2种,第3周= 3种,第4周=仍然3种 .

对于场地B,物种的累计总数将是:第1周= 0种,第2周= 1种,第3周= 1种,第4周= 1种等等......

任何建议将不胜感激 . 提前喝彩!

1 回答

  • 0

    我做了两个假设:

    • 站点B,第4周= 2种,"dog"和"rabbit";和

    • 所有网站共享相同的周数,因此如果至少在网站上有第4周,那么所有网站都应该包含它 . 这只会驱动 mt (空)变量,随时更新此变量 .

    我首先建议一个“空”data.frame,以确保网站填充了必需的周数:

    mt <- expand.grid(field_site = unique(ret$field_site),
                      week = unique(ret$week))
    

    tidyr 的使用有助于:

    library(tidyr)
    
    df %>%
      mutate(fake = TRUE) %>%
      # ensure all species are "represented" on each row
      spread(animal, fake) %>%
      # ensure all weeks are shown, even if no species
      full_join(mt, by = c("field_site", "week")) %>%
      # ensure the presence of a species persists at a site
      arrange(week) %>%
      group_by(field_site) %>%
      mutate_if(is.logical, funs(cummax(!is.na(.)))) %>%
      ungroup() %>%
      # helps to contain variable number of species columns in one place
      nest(-field_site, -week, .key = "species") %>%
      group_by(field_site, week) %>%
      # could also use purrr::map in place of sapply
      mutate(n = sapply(species, sum)) %>%
      ungroup() %>%
      select(-species) %>%
      arrange(field_site, week)
    # # A tibble: 12 × 3
    #    field_site   week     n
    #        <fctr> <fctr> <int>
    # 1           A      1     1
    # 2           A      2     2
    # 3           A      3     3
    # 4           A      4     3
    # 5           B      1     0
    # 6           B      2     1
    # 7           B      3     1
    # 8           B      4     2
    # 9           C      1     1
    # 10          C      2     1
    # 11          C      3     2
    # 12          C      4     3
    

相关问题