我有两个数据框,我想使用开始和结束过滤第一个数据框和第二个数据框。
数据框 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 来编写它。有人知道怎么写吗?
考虑这两个简单的数据框。
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')
这可以通过非相等连接来完成。在最新的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) ))