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