如何用dplyr::filter判断值是否属于至少一个区间?(行数不同场景)
解决方法
方法1:rowwise() + any() 逐行判断
通过按行处理df.tofilter,对每个f值检查是否匹配任意一个区间:
library(tidyverse) df.tofilter <- tibble(f=c(5,9), name=c("Dog","Cat")) df.tocheck <- tibble(l=c(0,2,4), u=c(1,3,7)) df.tofilter %>% rowwise() %>% filter(any(f >= df.tocheck$l & f <= df.tocheck$u)) %>% ungroup()
rowwise()让每一行独立处理,any()判断当前f是否满足至少一个区间条件,最后用ungroup()取消行分组状态。
方法2:purrr::map_lgl() 映射判断
借助purrr的映射函数,生成每个f的匹配逻辑向量:
df.tofilter %>% filter(map_lgl(f, ~any(.x >= df.tocheck$l & .x <= df.tocheck$u)))
map_lgl()遍历f的每个元素,返回长度一致的逻辑结果,供filter()筛选使用。
方法3:交叉连接后去重
先做两个数据框的交叉连接,筛选符合区间的行,再去重保留原数据的唯一行:
df.tofilter %>% cross_join(df.tocheck) %>% filter(f >= l & f <= u) %>% distinct(f, name)
这种方法适合需要查看具体匹配了哪个区间的场景,distinct()用于去除重复的原数据行。
错误原因说明
之前的代码报错是因为直接将长度为2的f向量,与长度为3的l、u向量做逐元素比较——R要求参与比较的向量长度要么相同,要么其中一个长度为1(自动循环),而这里长度不匹配且都大于1,因此触发向量长度不兼容的错误。我们需要实现的是“每个f和所有区间比较”的逻辑,而非按位置对应比较。
内容的提问来源于stack exchange,提问作者Ryan B
相关产品推荐
相关产品推荐

