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

时间:2015-06-02 16:06:24

标签: r subset

我有两个以bp为间隔的表,Table1有大的间隔,第二个有短的间隔(只有2bp)。我想创建一个新表,其中只包含表1范围,表中包含至少一个表2的元素包含在它们的“大”范围内。如果表2中没有与表1范围对应的元素,则不应包括表1的范围。

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

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

表2(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)

NewTable(dfout):

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

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

2 个答案:

答案 0 :(得分:2)

foverlaps

尝试data.table
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(提取索引)和子集&#39; df1&#39;使用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

答案 1 :(得分:0)

它似乎可以解决您的问题:

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