寻找重叠的范围和

时间:2017-05-21 23:05:50

标签: r range intervals

我有两个数据框,其中包含两个以范围报告的变量:mzmin,mzmed,mzmax,rtmin,rtmed和rtmax。为:

table1 <- read.csv("table1.csv")

name        mzmed       mzmin       mzmax       rtmed   rtmin   rtmax
M1          202.1110    202.110859  202.111285  50.35   49.62   51.13
M2          373.144219  373.143792  373.154876  50.38   49.62   51.86
M3          371.14497   371.144256  371.145224  80.34   79.62   81.41
M4          372.147279  372.146992  372.147583  100.35  99.62   101.41

table2 <- read.csv("table2.csv")

name        mzmed       mzmin       mzmax       rtmed   rtmin   rtmax
M1          558.109976  558.102886  558.111497  10.89   9.95    11.95
M2          371.144564  371.144000  371.144999  80.29   79.14   81.98
M3          498.091821  498.091632  498.092225  658.15  656.57  660.96
M4          284.098785  284.098429  284.099092  760.32  758.67  761.2

在这种情况下,table1的M3和table2的M2我想要写入新表,因为 mz范围重叠

如果M2和M3的rt范围小于100,那么只将它们写入新表是有益的。我假设IRanges在某种程度上最好用,但我不是正面的。

任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

正如Uwe Block评论的那样,foverlaps有效。

table1 <- data.table(read.table(header = T, 
                   text = "name        mzmed       mzmin       mzmax       rtmed   rtmin   rtmax
M1          202.1110    202.110859  202.111285  50.35   49.62   51.13
                   M2          373.144219  373.143792  373.154876  50.38   49.62   51.86
                   M3          371.14497   371.144256  371.145224  80.34   79.62   81.41
                   M4          372.147279  372.146992  372.147583  100.35  99.62   101.41
"))

table2 <- data.table(read.table(header = T, 
                     text = "name        mzmed       mzmin       mzmax       rtmed   rtmin   rtmax
M1          558.109976  558.102886  558.111497  10.89   9.95    11.95
M2          371.144564  371.144000  371.144999  80.29   79.14   81.98
M3          498.091821  498.091632  498.092225  658.15  656.57  660.96
M4          284.098785  284.098429  284.099092  760.32  758.67  761.2
"))

setkey(table2, mzmin, mzmax)
out <- foverlaps(table1, table2, type="any",nomatch=0L)

> out
   name    mzmed   mzmin   mzmax rtmed rtmin rtmax i.name i.mzmed  i.mzmin  i.mzmax i.rtmed i.rtmin i.rtmax
1:   M2 371.1446 371.144 371.145 80.29 79.14 81.98     M3 371.145 371.1443 371.1452   80.34   79.62   81.41

如果您希望mz的范围在rt范围的100范围内,那么您可以使用以下代码:

out[abs(mzmin-rtmax)<100 | abs(rtmin-mzmax)<100,]
Empty data.table (0 rows) of 14 cols: name,mzmed,mzmin,mzmax,rtmed,rtmin...