我有两个以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)
答案 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