繁体   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