如何在dplyr中结合多列区间条件过滤并计算匹配行数
解决方案
我们可以通过purrr::pmap_dbl同时处理多列过滤条件,它能一次性传递df2中的A_min、A_max、B_min、B_max四个参数,针对每个条件组合统计df1中符合要求的行数。
代码实现
library(dplyr) library(purrr) df1<-data.frame(A=c(1:10), B=c(3:12)) df2<-data.frame(A_min=c(2,3), A_max=c(3,3), B_min=c(1,2), B_max=c(2,2)) # 为df2添加匹配行数列 df2$match_count <- pmap_dbl(df2, function(A_min, A_max, B_min, B_max) { df1 %>% filter(A >= A_min, A <= A_max, B >= B_min, B <= B_max) %>% nrow() }) # 查看结果 df2
结果说明
运行后df2会新增match_count列,对应每个条件组合在df1中的匹配行数:
- 第一行条件(A∈[2,3]、B∈[1,2]):df1的B列从3开始,无符合B区间的行,所以
match_count为0 - 第二行条件(A∈[3,3]、B∈[2,2]):同样df1中B最小值为3,无匹配行,
match_count也为0
如果你的实际数据存在符合条件的记录,这个方法会准确统计对应数量。
替代方案(rowwise语法)
若更习惯dplyr的逐行处理逻辑,也可以用以下写法:
df2 %>% rowwise() %>% mutate(match_count = nrow(filter(df1, A >= A_min, A <= A_max, B >= B_min, B <= B_max))) %>% ungroup()
逻辑和pmap_dbl完全一致,只是通过rowwise()标记逐行处理df2的条件组合。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

