簡體   English   中英

R:具有不同組大小的類別的 150 個值的代表性隨機抽樣

[英]R: Representative random sampling for 150 values from categories with different group size

我面臨的問題是,我想從基於“站點”和“物種”兩個類別的數據集中隨機抽取 150 個樣本。 因此,理想情況下,我們每個站點有 30 個樣本的結果,其中每個物種或多或少地分布均勻。

可重現的例子:

df <- data.frame(site = rep(c("A", "B", "C", "D", "E"), each = 10), species = c("s1", rep("s2", each = 3), rep("s3", each = 16), rep("s4", each = 13), rep("s5", each = 17)), individual = c(1, 1:3, 1:16, 1:13, 1:17) )

我認為使用 dplyr 函數 group_by(site, species) 和 slice_sample() 是一個很好的方法,但是每組采樣一定數量而不是總共 150 個。我現在遇到的另一個問題是 slice_sample 至少需要 n-每組中的樣本量。 這並不總是給出。 那么,是否有可能總共抽取 150 個樣本,並且每當沒有提供每組所需的樣本量時,就只對其他樣本進行補償?

謝謝!

一種選擇是nest_by(site)然后使用slice_sample()從每組中抽取 30 個樣本。 如果需要,我們可以使用tidyr::unnest()來獲得一個包含所有繪制樣本的“正常” data.frame

問題可能是以下條件:

每個物種或多或少均勻分布的地方

當我們查看您的site時,我們可以看到大多數網站只有一個物種。 因此,從您的原始數據中抽取樣本將導致特定站點僅包含特定species 或者,我們可以只對species進行采樣並隨機分配一個site ,而不管該species從未在那里被觀察到的事實。

library(dplyr)
library(tidyr)

site_sample <- df %>% 
  nest_by(site) %>% 
  summarise(data = list(slice_sample(data, n = 30, replace = TRUE)))
#> `summarise()` has grouped output by 'site'. You can override using the `.groups`
#> argument.

site_sample
#> # A tibble: 5 x 2
#> # Groups:   site [5]
#>   site  data             
#>   <chr> <list>           
#> 1 A     <tibble [30 x 2]>
#> 2 B     <tibble [30 x 2]>
#> 3 C     <tibble [30 x 2]>
#> 4 D     <tibble [30 x 2]>
#> 5 E     <tibble [30 x 2]>

site_sample %>% 
  unnest(data)
#> # A tibble: 150 x 3
#> # Groups:   site [5]
#>    site  species individual
#>    <chr> <chr>        <dbl>
#>  1 A     s1               1
#>  2 A     s3               1
#>  3 A     s1               1
#>  4 A     s3               5
#>  5 A     s3               3
#>  6 A     s3               4
#>  7 A     s2               2
#>  8 A     s3               3
#>  9 A     s3               5
#> 10 A     s3               2
#> # ... with 140 more rows

原始數據

df <- data.frame(site = rep(c("A", "B", "C", "D", "E"), each = 10), species = c("s1", rep("s2", each = 3), rep("s3", each = 16), rep("s4", each = 13), rep("s5", each = 17)), individual = c(1, 1:3, 1:16, 1:13, 1:17) ) 

reprex 包(v2.0.1) 創建於 2022-12-16

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM