过滤列在另一个数据框的两个数字之间的行

问题描述 投票:0回答:2

我有两个数据框,我想使用开始和结束过滤第一个数据框和第二个数据框。

数据框 1:singletons_bovis

gene_id 开始 结束
WB0001 54 1500
WB0002 5410 15246

数据框 2:singletons_elegans

transcript_id 开始 结束
C55C2.5d 2547 54826
F12B6.1a.1 0 458

我想保留开始在 singletons_elegans 的 start-250 和 singletons_elegans 的 start+250 之间的 singletons_bovis 行。 结束也一样。

我试过这个命令:

df <- singletons_bovis %>% filter((start < singletons_elegans$start+250 & start > singletons_elegans$start-250) & (end > singletons_elegans$end-250 & end < singletons_elegans$end+250))

但是它不起作用...我不知道如何使用 dplyr 来编写它。有人知道怎么写吗?

r dplyr filter range multiple-conditions
2个回答
1
投票

考虑这两个简单的数据框。

singletons_bovis
#   start stop
# 1     1    5
# 2     1    9
# 3     2    4
# 4     1    8
# 5     7    8

singletons_elegans
#   start stop
# 1     1    4
# 2     5    6
# 3     2    4
# 4     2    7
# 5     1    3

你可以在没有

library
s的情况下做到这一点。

singletons_bovis[singletons_bovis$start >= singletons_elegans$start - 2.5 & 
                   singletons_bovis$stop <= singletons_elegans$stop + 2.5, ]
#   start stop
# 1     1    5
# 3     2    4
# 4     1    8

资料:

m <- 10
set.seed(42)
singletons_bovis <- as.data.frame(t(replicate(m, sort(sample(1:9, 2)))))
singletons_elegans <- as.data.frame(t(replicate(m, sort(sample(1:9, 2)))))
names(singletons_bovis) <- names(singletons_elegans) <- c('start', 'stop')

1
投票

这可以通过非相等连接来完成。在最新的dplyr版本中(

>= 1.1.0
),可以使用
join_by
来做到这一点

library(dplyr)# version >= 1.1.0
singletons_elegans %>%
     mutate(start1 = start + 250, start2 = start - 250,
                end1 = end -250, end2 = end + 250) %>%
      inner_join(singletons_bovis, ., by = join_by(closest(start < start1), 
           closest(start > start2), closest(end > end1), closest(end < end2)))

或使用

powerjoin

library(powerjoin)
 power_inner_join(singletons_bovis, singletons_elegans, by = 
   c(~ .x$start < (.y$start + 250) & .x$start > (.y$start - 250) & 
    .x$end > (.y$end - 250) & .x$end < (.y$end + 250) ))
© www.soinside.com 2019 - 2024. All rights reserved.