2015-06-02 50 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 
相關問題