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

问题描述:

我正在尝试为相机陷印调查生成物种饱和度曲线。我有成千上万的观察结果,并在dplyr中完成大部分操作。使用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种,等...

任何意见将是不胜感激。 提前欢呼!

+0

是不是站点B第4周= 2种,“狗”和“兔子”? – r2evans

我做两个假设:

  1. 站点B,每周4 = 2种,既有 “狗” 和 “兔”;和
  2. 所有网站共享同一周,所以如果至少在网站上有第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 
+0

感谢@ r2evans为您提供非常明确的答案。是的,你的两个假设都是正确的,一切都合情合理。然而,在将这种方法应用于我的完整数据集时,我遇到了一个问题。在实际研究中动物的观察通常在每个观察期(在本例中为几周)内变成多于一个,但是我的数据也可以组织成几个月和几天)。这在expand.grid方法的full_join阶段会产生问题。它返回“错误:行重复标识符(1,2,3,4,5),...”任何想法如何解决这个问题? –

+0

您是否可以更新您的样本数据以反映这种情况? – r2evans

+0

当然@ r2evans,这里是第二周在A站点的额外的“狗”观察的更新,以及B站第三周的额外的“兔子”观察。field_site