2017-03-14 1 views
1

カメラ捕捉測量の種飽和曲線を生成しようとしています。私は何千もの観察をして、私の操作の大部分をdplyrで行います。dplyrを使用して、異なる要因の合計を集計します。

私は3つのフィールドサイトを持ち、数週間のトラッピングからの異なる動物種の観察記録を持っています。いくつかの週には動物はなく、他の週には複数の種が存在するかもしれません。私は、研究の連続した週に遭遇する新種の速さを比較するために、各サイトごとに別の数字を生成したいと考えています。これらの新しい種の観察は、一旦種全体の多様性がその地域で捕獲されると、最終的に飽和するはずである。一部のフィールドサイトは他のサイトよりも速く飽和する可能性があります。

問題は、別の種の数を数えて時間をずらして合計を提供する方法に遭遇していないことです。単純なダミーデータセットは以下の通りです。

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週目から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

私は2つの仮定作ってるん:

  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 @ – r2evans

+0

確実なことは、ここでは、サイトBの週3でサイトAで週2で追加の「犬」の観測、および追加の「ウサギ」の観測の更新field_site <-c(担当者(「A」、5)は、ありますrep( "B"、6)、rep( "C"、4))週<-c(1,2,2,2,3,2,3,3,4,4,1,2,3 、犬(dog)、犬(dog)、猫(cat)、ウサギ(dog)、犬(dog)、ウサギ(rabb it)、ウサギ(rabbit)、犬(dog) df <-as.data.frame(cbind(field_site、week、animal)、head = TRUE)##これは次のように生成します。同じエラー - –

関連する問題