如何用Tidyverse在R中生成包含全部30个站点的40个随机抽样值?
用Tidyverse实现覆盖所有站点的随机抽样策略
要实现每个站点(1-30)至少出现一次、总长度为40的随机序列,核心思路是先确保所有站点都被包含,再补充随机重复的站点,最后打乱顺序。用Tidyverse可以轻松实现:
步骤分解
- 先生成包含全部30个站点的基础序列,保证每个站点至少出现一次
- 从站点池中随机抽取10个(允许重复),补充到基础序列中
- 将合并后的序列打乱顺序,得到最终结果
代码实现
library(tidyverse) df <- data.frame(sites = 1:30) # 生成包含所有站点的基础序列 base_sites <- df %>% pull(sites) # 随机抽取10个可重复的补充站点 extra_sites <- df %>% sample_n(size = 10, replace = TRUE) %>% pull(sites) # 合并并打乱顺序 final_sample <- c(base_sites, extra_sites) %>% sample(size = length(.), replace = FALSE) # 验证结果 length(final_sample) # 输出40,符合总长度要求 all(1:30 %in% final_sample) # 输出TRUE,确认所有站点都被覆盖
简化管道写法
如果偏好更紧凑的链式代码,可以把所有步骤整合到一条管道中:
final_sample <- df %>% bind_rows(df %>% sample_n(10, replace = TRUE)) %>% pull(sites) %>% sample(size = 40, replace = FALSE)
内容的提问来源于stack exchange,提问作者David Smith
相关产品推荐
相关产品推荐

