如何在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
代码说明
- 转换规则格式:把宽格式的
dat1转为长格式,让每个company和label的组合对应明确的抽样数量,方便后续关联原始数据。 - 关联规则与原始数据:用
inner_join筛选出dat2中需要抽样的行,同时带上对应的抽样数量。 - 分组抽样:按
company和label分组后,使用slice_sample随机抽取指定数量的行,first(sample_n)确保每组使用对应的抽样数量。 - 整理结果:取消分组并移除临时的抽样数量列,得到符合预期格式的结果。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

