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

使用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

细节说明

  1. 分组判断:用grepl("Apple", Fruit)识别苹果类记录,any()判断当前篮子是否为苹果组
  2. 抽样逻辑:苹果组强制每组抽1条,避免同篮子重复抽取苹果;香蕉组可根据需求修改slice_sample的参数,比如用prop = 0.5按比例抽样,或n = 1固定抽1条
  3. 特殊场景兼容:对于一个篮子里有多个同类型苹果(如示例中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:51:27