使用dplyr的slice_sample实现R语言数据集条件随机抽样
R实现按篮子分组的条件随机抽样
可以用dplyr包的分组操作结合slice_sample来实现你的需求,核心思路是按Basket分组后,对苹果组和香蕉组分别处理:
步骤说明
- 按
Basket字段分组,区分每个篮子的类型(苹果组/香蕉组) - 苹果组:每个篮子仅随机抽取1条记录
- 香蕉组:按正常需求抽样(示例中按每个篮子抽1条,可根据实际调整抽样数量/比例)
代码实现
首先加载依赖包,然后处理数据:
# 加载dplyr包 library(dplyr) # 你的示例数据集 df <- structure(list(Basket = c(1L, 1L, 2L, 3L, 3L, 4L, 5L, 5L, 6L, 7L, 7L, 8L, 9L, 9L, 10L), Fruit = c("Apple.1", "Apple.2", "Banana", "Apple.1", "Apple.2", "Banana", "Apple.1", "Apple.2", "Banana", "Apple.1", "Apple.2", "Banana", "Apple.1", "Apple.1", "Banana" )), class = "data.frame", row.names = c(NA, -15L)) # 执行条件抽样 sampled_df <- df %>% group_by(Basket) %>% mutate(is_apple_group = any(grepl("Apple", Fruit))) %>% slice_sample(n = ifelse(is_apple_group, 1, 1)) %>% # 香蕉组这里n可按需调整,比如设为1或按比例 ungroup() %>% select(-is_apple_group) # 移除临时标记字段 # 查看结果 sampled_df
细节说明
- 分组判断:用
grepl("Apple", Fruit)识别苹果类记录,any()判断当前篮子是否为苹果组 - 抽样逻辑:苹果组强制每组抽1条,避免同篮子重复抽取苹果;香蕉组可根据需求修改
slice_sample的参数,比如用prop = 0.5按比例抽样,或n = 1固定抽1条 - 特殊场景兼容:对于一个篮子里有多个同类型苹果(如示例中的Basket9有两个Apple.1),
slice_sample(n=1)也会只随机抽取1条,符合需求
如果需要抽取固定总数量的样本,可以先分别处理苹果组和香蕉组,再合并:
# 示例:抽取10条样本,其中苹果组占6条,香蕉组占4条 # 先处理苹果组:抽取6个不同篮子的苹果 apple_samples <- df %>% filter(grepl("Apple", Fruit)) %>% distinct(Basket, .keep_all = FALSE) %>% slice_sample(n = 6) %>% left_join(df, by = "Basket") %>% group_by(Basket) %>% slice_sample(n = 1) %>% ungroup() # 处理香蕉组:抽取4条香蕉 banana_samples <- df %>% filter(Fruit == "Banana") %>% slice_sample(n = 4) # 合并结果 final_sample <- bind_rows(apple_samples, banana_samples)
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

