繁体   English   中英

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)。

先感谢您。

考虑到你的数据集的大小,我建议foverlapsdata.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.xx对象中指定两个(不同)列。 我知道在这种情况下解决此问题的唯一方法是,我们希望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM