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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:40:02