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

如何在R中依据dat1规则从dat2中按label标签随机抽样行?

R按规则实现分组抽样的解决方案

我有如下两个数据框:

dat1<-data.frame(company=c("a","b","c"),
                 random=c(2,1,1),
                 prior=c(1,3,1))

dat2<-data.frame(company=c("a","a",'a',"b","b","a","a","c","c","c",
                           "b","b","b"),
                 peter=c(5,0,1,1,1,0,100,7,8,7,0,0,1),
                 turner=c(5,1,2,1,2,0,200,7,9,6,0,0,0),
                 austin=c(7,5,3,1,0,0,300,77,10,5,0,1,1),
                 label=c("random","random","prior","random","random","random","prior",
                         "random","random","prior","prior","prior","prior"))

其中dat2为原始数据,dat1定义了抽样规则:针对每个company,需从dat2中对应company且label=="random"的行里随机抽取dat1$random指定的行数,同时从对应company且label=="prior"的行里抽取dat1$prior指定的行数。最终预期得到如下数据框:

data<-data.frame(company=c("a","a","a","b","b","b","b","c","c"),
                 peter=c(5,0,100,1,0,0,1,7,7),
                 turner=c(5,1,200,1,0,0,0,7,6),
                 austin=c(7,5,300,1,0,1,1,77,5),
                 label=c("random","random","prior","random","prior","prior","prior","random","prior"))

实现方法

我们可以用dplyr结合tidyr包来完成这个分组抽样任务,步骤如下:

# 加载所需包
library(dplyr)
library(tidyr)

# 将规则数据框dat1转换为长格式,使每个company-label组合对应抽样数量
dat1_long <- dat1 %>%
  pivot_longer(cols = c(random, prior), names_to = "label", values_to = "sample_n")

# 按规则执行抽样
sampled_result <- dat2 %>%
  # 关联抽样规则,只保留需要处理的分组
  inner_join(dat1_long, by = c("company", "label")) %>%
  # 按company和label分组
  group_by(company, label) %>%
  # 抽取指定数量的行
  slice_sample(n = first(sample_n)) %>%
  # 取消分组
  ungroup() %>%
  # 移除临时的抽样数量列
  select(-sample_n)

# 查看最终抽样结果
sampled_result

代码说明

  1. 转换规则格式:把宽格式的dat1转为长格式,让每个company和label的组合对应明确的抽样数量,方便后续关联原始数据。
  2. 关联规则与原始数据:用inner_join筛选出dat2中需要抽样的行,同时带上对应的抽样数量。
  3. 分组抽样:按company和label分组后,使用slice_sample随机抽取指定数量的行,first(sample_n)确保每组使用对应的抽样数量。
  4. 整理结果:取消分组并移除临时的抽样数量列,得到符合预期格式的结果。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:41:16