![](/img/trans.png)
[英]Select rows in one table that comes from a range of two columns in another table using R
[英]R, if number in one table belongs to range in another
我有2张桌子。 第一个看起来像:
V1 V2
128 1.0000
139 0.9375
141 1.0000
第二个看起来像:
V1 V2 V3
gene 90 100
mRNA 120 129
CDS 130 139
CDS 140 150
第二张表中的V2和V3是范围的边界(例如90:100、120:129等),因此我需要比较第一张表的V1中的数字(如果它属于任何范围)。 如果是这样,我需要将这些行绑定在一起。 所以看起来像
V1.1 V2.1 V1.2 V2.2 V3.2
128 1.0000 mRNA 120 129
139 0.9375 CDS 130 139
141 1.0000 CDS 140 150
或
问题在于这些表确实很大(每个表约5G)。
先感谢您。
考虑到你的数据集的大小,我建议foverlaps
在data.table
包:
library(data.table)
##
setDT(d1)
setDT(d2)
##
setnames(d2,c("V1.y","V2.y","V3.y"))
setkeyv(d2,c("V2.y","V3.y"))
##
setnames(d1,c("V1.x","V2.x"))
d1[,V11:=V1.x]
##
Merged <- foverlaps(
x=d1,y=d2,
by.x=c("V1.x","V11"),
type="within")
Merged[,V11:=NULL]
##
R> Merged
V1.y V2.y V3.y V1.x V2.x
1: mRNA 120 129 128 1.0000
2: CDS 130 139 139 0.9375
3: CDS 140 150 141 1.0000
为了清楚起见,我在其中附加了.x
和.y
。 foverlaps
主要用于连接两个范围,在每个使用的表中一个,因此它要求by.x
在x
对象中指定两个(不同)列。 我知道在这种情况下解决此问题的唯一方法是,我们希望x
一列在y
的两列范围内,这是创建一个临时重复列。 这是d1[,V11:=V1.x]
; 之后将其删除。
数据:
d1 <- read.table(
text="V1 V2
128 1.0000
139 0.9375
141 1.0000",
header=TRUE)
d2 <- read.table(
text="V1 V2 V3
gene 90 100
mRNA 120 129
CDS 130 139
CDS 140 150",
header=TRUE)
就个人而言,我不会在R中执行此操作,尽管可能使用GRanges等生物导体程序包之一来实现。 相反,我会将文件转换为BED格式 ,对其进行排序(使用sort -k1,1 -k2,2n)并使用bedtools相交 ,例如
intersectBed -a tbl1.bed -b tbl2.bed -wa -wb -sorted > merged.bed
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.