2017-05-21 3 views
0

Ich habe zwei Datenrahmen, die zwei Variablen enthalten, die in Bereichen gemeldet werden: mzmin, mzmed, mzmax, rtmin, rtmed und rtmax. Sein:Suche nach überlappenden Bereichen und

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 

In diesem Fall M3 von table1 und M2 von table2 möchte ich eine neue Tabelle geschrieben werden, da die mz Bereiche überlappen.

Es wäre von Vorteil, sie auch nur in die neue Tabelle schreiben zu lassen, wenn der RT-Bereich von M2 und M3 weniger als 100 entfernt ist. Ich gehe davon aus, dass IRanges irgendwie am besten genutzt wird, aber ich bin nicht positiv.

Jede Hilfe oder Anregung wäre willkommen.

+3

Vielleicht 'foverlaps()' 'vom data.table 'Paket könnte für Sie arbeiten. – Uwe

Antwort

1

Wie Uwe Block kommentierte, funktioniert 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 

Wenn Sie den Bereich von mz wollen innerhalb von 100 des Bereichs von rt sein, dann können Sie den folgenden Code verwenden:

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