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

