2015-06-02 51 views
0

我有两个由bp间隔组成的表,Table1具有较大的间隔,第二个表具有较短的间隔(仅2bp)。我想创建一个只包含Table 1范围的新表,它们的“大”范围至少包含一个表2的元素。如果表2中没有与表1范围对应的元素,则不应包含表1中的该范围。包含另一个表中至少一个元素的表的子集

在表1(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) 

表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) 
+0

您的具体问题是什么?请参阅http://stackoverflow.com/help/how-to-ask您可能需要澄清如何包含或不包含项目的逻辑。这也有助于说出“bp”的含义。 – GreenGiant

回答

2

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 

尝试foverlaps或者作为@Arun评论,我们可以使用which=TRUE使用yid柱(提取索引)和子集 'DF1'。

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

@Arun谢谢,这很有帮助 – akrun

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 
相关问题