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
我有两个由 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