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

如何在R语言中基于两列范围和外部向量筛选data.frame行?

问题描述

现有一个包含位置范围(Initial和Final列)的数据框,以及一个Position向量,数据如下:

df <- data.frame(
   row = c("A", "B", "C", "D"), 
   Initial = c(10, 26, 48, 69), 
   Final = c(23, 47, 64, 80))

对应的数据框内容:

row Initial Final
1   A      10    23
2   B      26    47
3   C      48    64
4   D      69    80

位置向量:

Position <- c(32, 54, 82)

需求:筛选出数据框中包含该向量中任一位置的行,预期输出如下:

row Initial Final
1   B      26    47
2   C      48    64

注:位置82未匹配到任何范围,因此对应的行不会被筛选出来。需要使用tidyverse工具实现该需求。

tidyverse 解决方案

这里提供两种简洁的实现方式:

方法一:行级逻辑判断

利用dplyr::filter()结合purrr::pmap_lgl(),逐行检查是否有位置落在当前行的区间内:

library(tidyverse)

df %>%
  filter(pmap_lgl(., ~any(between(Position, ..2, ..3))))

方法二:范围连接匹配

将位置向量转为数据框后,通过范围连接条件匹配,再去重得到结果:

library(tidyverse)

tibble(Position) %>%
  left_join(df, by = join_by(Position >= Initial, Position <= Final)) %>%
  drop_na(row) %>%
  distinct(row, Initial, Final)

说明

  • 方法一中,pmap_lgl()遍历数据框的每一行,between(Position, ..2, ..3)判断每个位置是否落在当前行的Initial(..2)和Final(..3)区间内,any()确认是否存在至少一个符合条件的位置,最终返回逻辑向量用于筛选行。
  • 方法二中,join_by(Position >= Initial, Position <= Final)指定了范围连接规则,匹配后通过drop_na()移除未匹配的行,distinct()保证结果行唯一。

内容的提问来源于stack exchange,提问作者T.B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:25:21