[英]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.