2017-03-14 30 views
1

我正在嘗試爲相機陷印調查生成物種飽和度曲線。我有成千上萬的觀察結果,並在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

回答

0

我做兩個假設:

  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 <-c(rep(「A」,5), rep(「B」,6),rep(「C」,4))周<-c(1,2,2,2,3,2,3,3,3,4,4,1,2,3 ,4)動物<-c(「狗」,「狗」,「狗」,「貓」,「兔」,「狗」,「狗」,「兔子」,「兔子」,「狗」 (兔子,貓,貓,兔,狗)df相同的錯誤 - –