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

如何对tibble中的id组进行有放回Bootstrap重采样(3次)

实现分组级有放回重采样的方法

咱先把需求掰扯清楚:你要的是把每个id对应的所有行当成一个完整单元,从这3个单元里有放回地抽取3次,最后把抽中的单元的行全部合并,绝对不能拆分单个分组的行——这也是你给出的两个错误结果的问题所在:它们都是抽了单独的行,而非完整分组。

下面给你两个用tidyverse工具实现的靠谱方案:

方案1:拆分分组列表后抽样(直观易懂)

先把原数据按id拆成一个个分组的列表,再对列表做有放回抽样,最后合并成tibble:

library(tibble)
library(dplyr)

# 你的原始数据
tbl_ <- tibble(id = c(1,1,2,2,3,3), dta = 1:6)

# 执行分组重采样
resampled_tbl <- tbl_ %>%
  group_split(id) %>%  # 按id拆分,得到3个分组的列表
  sample(size = 3, replace = TRUE) %>%  # 有放回抽3个分组
  bind_rows()  # 把抽中的分组行合并

# 查看结果
resampled_tbl

每次运行这段代码,都会得到符合要求的结果——比如可能抽中id=1两次、id=3一次,对应的6行都是完整的分组行。

方案2:用slice_sample直接指定抽样单元(更简洁)

dplyr的slice_sample()有个by参数,可以直接指定抽样的单元是某个分组,一步到位:

resampled_tbl <- tbl_ %>%
  slice_sample(
    by = id,  # 把每个id对应的行作为一个抽样单元
    n = 3,  # 抽取3个单元
    replace = TRUE  # 开启有放回抽样
  )

resampled_tbl

这个方法更简洁,不需要手动拆分列表,直接告诉函数“按id分组来抽”就行,完全匹配你的需求。

为啥那两个结果不符合要求?

  • 结果1:出现了单独的id=1的行和id=2的行,说明抽样时是针对单个行而非整个分组,破坏了分组的完整性
  • 结果2:出现了重复的id=1的同一行,同样是抽行而非抽分组,不符合“对整个id分组重采样”的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:20