R,如果一个表中的数字属于另一个表中的范围

标签 r

我有两张 table 。第一个看起来像:

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 中的数字是否属于任何范围。如果是这样,我需要将这些行绑定(bind)在一起。 所以它看起来像

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

提前谢谢您。

最佳答案

考虑到数据集的大小,我建议在 data.table 包中使用 foverlaps:

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.yfoverlaps 主要用于连接两个范围,每个使用的表中都有一个范围,因此它要求 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,如果一个表中的数字属于另一个表中的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622913/

相关文章:

r - 使用 ROracle 在 R 中执行存储的 Oracle 过程

windows - R:即使指定编码也无法读取unicode文本文件

r - 自动堆叠数据框的每第 n 列

r - 将篮子数据框融化为没有循环的单个数据框

r - 基本图形和 ggplot2 之间的直方图 binwidth (in) 一致性

r - 子集 data.table 的速度以奇怪的方式取决于特定的键值?

r - 在 R 中编写一个包含 if/else 语句和 rowSums() 的函数,定义如何处理 NA

r - 我可以以编程方式更新 data.table 中一组列的类型(到因子)吗?

R:在 X-Y 网格中查找缺失的组合

r - 在多列上应用 tidyr::separate