如何在R中按组重采样行并使用相同随机种子?
解决方案
要实现按name分组后,每个组得到完全相同的有放回重采样结果,有两种直接的方法:
方法1:分组后固定相同随机种子采样
利用group_modify()对每个分组单独处理,在slice_sample()中指定统一的种子,确保所有组生成一致的采样结果:
library(tidyverse) # 构造示例数据 names <- c(rep("a", 3), rep("b", 3), rep("c", 3)) test <- tibble(name = names, number = rep(c(1:3), 3)) # 分组重采样,每组使用相同种子 test_resampled <- test %>% group_by(name) %>% group_modify(~ slice_sample(.x, n = 3, replace = TRUE, set.seed = 456)) %>% ungroup() # 查看结果 test_resampled
说明
group_modify()会遍历每个分组,对每组数据单独执行slice_sample;set.seed = 456确保所有分组使用同一随机种子,因此采样结果完全一致;- 额外设置全局
set.seed()可以保证整个流程的可复现性(可选)。
方法2:直接指定固定采样索引
如果已经明确需要的采样结果(比如示例中的1-2-2),可以直接指定采样的行索引,完全控制输出:
test_resampled <- test %>% group_by(name) %>% slice(c(1, 2, 2)) %>% ungroup() # 输出结果 test_resampled
说明
slice(c(1,2,2))会在每个分组中重复选取第1、2、2行,直接得到你期望的输出;- 这种方法不需要随机种子,结果完全确定。
输出结果(与期望一致):
# name number # <chr> <int> # 1 a 1 # 2 a 2 # 3 a 2 # 4 b 1 # 5 b 2 # 6 b 2 # 7 c 1 # 8 c 2 # 9 c 2
内容的提问来源于stack exchange,提问作者WenliL
相关产品推荐
相关产品推荐

