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

如何在R中基于指定列对数据集行进行重复抽样?

R实现分组有放回重复抽样方案

原始数据集

df <- data.frame(id = c(1,1,1,1,1,2,2,2,2,2),
                 v1 = c(1,2,3,4,5,6,7,8,9,10))

需求说明

针对每个唯一id,执行有放回随机抽样:

  • 每次抽取3行
  • 每个id重复抽样2次
  • 最终合并为一个数据框

方案1:使用dplyr包(tidyverse风格)

library(dplyr)

set.seed(123) # 设置随机种子保证结果可复现
sampled_df <- df %>%
  group_by(id) %>%
  do({
    # 对当前id的组重复2次抽样,每次抽3行
    bind_rows(replicate(2, sample_n(., size = 3, replace = TRUE), simplify = FALSE))
  }) %>%
  ungroup()

# 查看结果
print(sampled_df)

代码解释

  • group_by(id):按id分组处理
  • replicate(2, ...):重复执行2次抽样操作
  • sample_n(., size = 3, replace = TRUE):从当前组中有放回抽取3行
  • bind_rows():把两次抽样的结果合并成一个数据框
  • ungroup():取消分组状态,得到最终的普通数据框

方案2:使用基础R(无需额外包)

set.seed(123) # 保证结果可复现

# 获取所有唯一id
unique_ids <- unique(df$id)

# 初始化空数据框存储结果
sampled_df <- data.frame(id = integer(), v1 = integer())

for (id_val in unique_ids) {
  # 提取当前id对应的行
  group_data <- df[df$id == id_val, ]
  # 重复2次抽样,每次3行,有放回
  for (i in 1:2) {
    sample_rows <- group_data[sample(nrow(group_data), size = 3, replace = TRUE), ]
    sampled_df <- rbind(sampled_df, sample_rows)
  }
}

# 查看结果
print(sampled_df)

代码解释

  • 遍历每个唯一id,单独处理每组数据
  • sample(nrow(group_data), size = 3, replace = TRUE):生成随机行索引,实现有放回抽样
  • rbind():逐步合并每次抽样的结果到最终数据框

执行后得到的结果结构与预期一致,由于是随机抽样,具体数值会因随机种子不同而变化,设置set.seed()可以固定结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:39:59