如何删除介于其他两个列值之间的行?

How can I delete rows that fall between two other column values?

我有一个data.frame1:

BIN     CHR     BP1             BP2             Score   Value
12      chr1    29123222        29454711        -5.7648 599
116     chr13    45799118        45986770        -4.8403 473
117     chr5    46327104        46490961        -5.3036 536
121     chr6    50780759        51008404        -4.4165 415
133     chr18    63634657        63864734        -4.8096 469
147     chr1   77825305        78062178        -5.4671 559

我有第二个 data.frame2 像:

    CHR     SNP             A1      A2      BP        INFO    OR      SE      P      NGT   
    chr1    rs10900604      A       G       29204555  0.774   1.01582 0.0143  0.2723  0
    chr3    rs12132517      A       G       79880711  0.604   0.98334 0.0253  0.5071  2
    chr14    rs11240777      A       G       79895429  0.818   0.98817 0.0139  0.3907  27
    chr18    rs147634896     T       C       63789900  0.623   1.02634 0.0259  0.3161  0
    chr6    rs143609865     A       T       77934001  0.617   1.01562 0.0317  0.6254  0

我有兴趣保留 data.frame2 中符合以下条件的所有行:它们在 data.frame1 中的任何行的 BP1 和 BP2 之间具有相同的 CHR 和 BP 值。

例如,data.frame2 的第一行有 "chr1",并且在 data.frame1 的一个 BP 范围之间也有一个 "BP"。请注意,它不属于第 7 行的范围,但确实属于第 1 行的范围。因此,我想将这一行保留在 data.frame2

另一个例子,data.frame2的第4行有"chr18"和BP 63789900落在data.frame1第5行的BP范围内(BP1和BP2之间)。因此,我想将这一行保留在 data.frame2

最后一个例子。请注意,data.frame2 中的第 5 行的 BP 77934001 落在 data.frame1 中第 6 行的 BP1 和 BP2 范围内。然而在 data.frame2 中 "chr6" 与 "chr1" 不匹配。我想删除这一行。

我还想删除不同时匹配 CHR 和 BP 范围的所有其他行。

我在想如果循环有 CHR1=CHR2,并且 BP>BP1 和 BP

这应该可以使用 base R:

# merge the relevant data
dfmerge = merge(df1[c("CHR", "BP1", "BP2")], df2, by = "CHR")

# delete unwanted rows
dfmerge = dfmerge[(dfmerge$BP > dfmerge$BP1 & dfmerge$BP < dfmerge$BP2),]

# clean up columns
dfmerge[c("BP1", "BP2")] = list(NULL)

一般来说,SQL可以做到简洁明了:

library(sqldf)

sqldf("select df2.*
       from df2 inner join df1
       on df2.CHR = df1.CHR
       and df2.BP between df1.BP1 and df2.BP2")

这是一个dplyr方法:

d %>%
  left_join(d2) %>%
  filter(BP >= BP1 & BP <= BP2)