table 的子集,至少包含另一个 table 的一个元素

Subset of a table that contains at least one element of another table

我有两个由 bp 间隔组成的 tables,Table1 具有较大间隔,第二个具有较短间隔(仅 2bp)。我想创建一个新的 table,它只包含 Table 1 个范围,这些范围至少有一个 table 2 的元素包含在它们的 "large" 范围中。如果 table 2 中没有对应于 table 1 范围的元素,则不应包括 Table 1 的范围。

在此示例中,不应包括 Table1 (df) 的第 2 行 (1, 600, 1500):

df <- "Chromosome start end
    1  1 450
    1 600 1500 
    2 3500 3585 
    2 7850 10000"
df <- read.table(text=df, header=T)

Table2 (df2)

df2 <- "Chromosome start end
    1 5 6
    1 598 599 
    2 3580 3581 
    2 7851 7852
    2  7859 7860"

df2 <- read.table(text=df2, header=T)

新建Table (dfout):

dfout <- "Chromosome start end
1 1 450
2 3500 3585
2 7850 10000"

dfout <- read.table(text=df2, header=T)

看来可以解决你的问题:

ranges <- merge(df,df2,by="Chromosome",suffixes=c("A","B"))
ranges <- ranges[with(ranges, startA <= startB & endA >= endB),]
ranges <- ranges[,1:3]
dfout <- unique(ranges)
    dfout
# Chromosome startA  endA
#     1      1   450
#     2   3500  3585
#     2   7850 10000

data.table

开始尝试 foverlaps
library(data.table)
setkey(setDT(df1), Chromosome, start, end)
setkey(setDT(df2), Chromosome, start, end)
setnames(unique(foverlaps(df1, df2, nomatch=0)[, c(1,4:5),
                         with=FALSE]), names(df1))[]
#   Chromosome start   end
#1:          1     1   450
#2:          2  3500  3585
#3:          2  7850 10000

或者正如@Arun 评论的那样,我们可以使用 which=TRUE(提取索引)和子集 'df1' 使用 yid 列。

df1[unique(foverlaps(df2, df1, nomatch=0L, which=TRUE)$yid)]
#    Chromosome start   end
#1:          1     1   450
#2:          2  3500  3585
#3:          2  7850 10000