R语言两个DataFrame执行Inner Join时如何按指定数量提取匹配行
实现方法
你可以在关联两个表后按匹配字段分组,按Number指定的数量截取对应行数即可,参考代码如下:
library(tidyverse) # 方案1:按df1原有顺序取对应数量的行 result <- inner_join(df1, df2, by = c("Measures", "Format")) %>% filter(Number > 0) %>% # 过滤掉提取数量为0的类别 group_by(Measures, Format) %>% # 按匹配维度分组 slice_head(n = first(Number)) %>% # 每个分组取前N行,N为该组指定的提取数量 ungroup() %>% select(-Number) # 不需要Number字段可移除 # 方案2:如果需要随机抽取对应数量的题目(更适合组卷场景),把slice_head替换为slice_sample即可 result_random <- inner_join(df1, df2, by = c("Measures", "Format")) %>% filter(Number > 0) %>% group_by(Measures, Format) %>% slice_sample(n = first(Number)) %>% ungroup() %>% select(-Number)
逻辑说明
- 先用
inner_join完成两个表的匹配,让df1中每一行匹配到对应类别的提取数量 - 过滤掉
Number为0的分组,避免返回不需要的内容 - 按
Measures和Format两个匹配字段分组 - 每组内按需求取指定数量的行:需要保留原有顺序用
slice_head,需要随机抽样用slice_sample - 最后可按需移除冗余的
Number字段
内容的提问来源于stack exchange,提问作者ujjwal tyagi
相关产品推荐
相关产品推荐

