如何在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.
相关产品推荐
相关产品推荐

