如何对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
相关产品推荐
相关产品推荐

