You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中按步骤从多数据集数据框中分层随机抽取指定行数样本

分步骤实现跨数据集随机抽样需求

需求说明

现有数据框结构如下:

  • 每行对应一条物种记录,同一dataset内无重复物种,但物种可跨dataset重复
  • 需要完成分步骤随机抽样:
    • Step 1:随机抽取1行样本
    • Step 2:随机抽取2行,且2行来自不同dataset
    • ...
    • Step 11:随机抽取11行,且11行全部来自不同dataset

示例数据

用户提供的示例数据构造代码:

# 构造示例数据框
x1 <- matrix(rnorm(200), nrow= 100, ncol=2)
x2 <- c(replicate(5, "AA"),replicate(15, "BB"),replicate(15, "CC"),
        replicate(10, "DD"),replicate(10, "EE"),replicate(10, "FF"),
        replicate(10, "GG"),replicate(5, "HH"),replicate(5, "II"),
        replicate(15, "JJ"))
df <- data.frame(cbind(x1,x2))
colnames(df) <- c("variable1", "variable2","dataset")
# 修正数值列类型(cbind会自动转成字符型,这里还原)
df$variable1 <- as.numeric(df$variable1)
df$variable2 <- as.numeric(df$variable2)

问题分析

用户尝试使用sampling包的strata()函数,但该函数是按指定的每个层(dataset)抽样数量执行分层抽样,无法直接满足「抽取k个来自不同dataset的样本」的需求。

解决方案

使用dplyr包实现分组抽样逻辑,编写通用函数处理不同步骤的抽样需求:

# 安装并加载dplyr(若未安装)
# install.packages("dplyr")
library(dplyr)

# 定义抽样函数:输入数据框和抽样行数k,返回符合要求的样本
sample_cross_dataset <- function(df, k) {
  if (k == 1) {
    # Step1:直接随机抽取1行
    return(df %>% sample_n(size = 1))
  }
  
  # 检查可用的不同dataset数量
  unique_ds_count <- length(unique(df$dataset))
  if (unique_ds_count < k) {
    stop(paste("错误:当前仅存在", unique_ds_count, "个不同dataset,无法抽取", k, "个跨dataset样本"))
  }
  
  # 随机选择k个不同的dataset,再从每个dataset中各抽1行
  df %>%
    filter(dataset %in% sample(unique(df$dataset), size = k)) %>%
    group_by(dataset) %>%
    sample_n(size = 1) %>%
    ungroup()
}

# 执行各步骤抽样
step1_sample <- sample_cross_dataset(df, 1)
step2_sample <- sample_cross_dataset(df, 2)
step3_sample <- sample_cross_dataset(df, 3)
# ...
step11_sample <- sample_cross_dataset(df, 11) # 注意:需确保df中至少有11个不同dataset,否则会触发报错

逻辑说明

  1. k=1的情况:无需考虑dataset,直接随机抽取1行即可
  2. k≥2的情况:
    • 先校验现有不同dataset的数量是否满足需求,避免无效抽样
    • 随机挑选k个不重复的dataset
    • 对每个选中的dataset,随机抽取1条记录,最终得到k条来自不同dataset的样本

内容的提问来源于stack exchange,提问作者mmmap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:48:11