Добро пожаловать в SO!
Я определенно не эксперт в data.table
, но подумал, что здесь может быть возможность. Я надеюсь, что кто-то может опубликовать лучшую альтернативу (но на всякий случай, здесь есть что рассмотреть).
foverlaps
с пакетом data.table
отлично подходит для просмотра перекрытий между диапазонами, хотя в вашем случае Вы проверяете два разных столбца на совпадения между двумя разными фреймами данных. Я не знаю, как это сделать с помощью одного foverlaps
звонка. Однако вы можете сделать два отдельных вызова, а затем объединить результаты.
Вот мой пример. Начал бы с установки минимальных и максимальных столбцов как для пептида, так и для фрагмента. Затем вы можете использовать setkey
и foverlaps
для определения совпадений, сначала по фрагменту, а затем по пептиду. Наконец, объединение, где перекрытие существует из обоих результатов.
Я создал уникальный идентификатор как в Peaks
, так и в Targets
, чтобы проверить, работает ли он как задумано (и оставил, хотя и удалил другие столбцы, такие как min и макс.)
library(data.table)
tolerance = .001
setDT(Peaks)
setDT(Targets)
Peaks[ , `:=`(minP = Peptide.mz - (Peptide.mz * tolerance),
maxP = Peptide.mz + (Peptide.mz * tolerance),
minF = Fragment.mz - (Fragment.mz * tolerance),
maxF = Fragment.mz + (Fragment.mz * tolerance),
PID = .I)]
Targets[ , `:=`(minP = Peptide.mz - (Peptide.mz * tolerance),
maxP = Peptide.mz + (Peptide.mz * tolerance),
minF = Fragment.mz - (Fragment.mz * tolerance),
maxF = Fragment.mz + (Fragment.mz * tolerance),
TID = .I)]
setkey(Peaks, minF, maxF)
setkey(Targets, minF, maxF)
result1 <- foverlaps(Peaks, Targets, nomatch = 0L)
setkey(Peaks, minP, maxP)
setkey(Targets, minP, maxP)
result2 <- foverlaps(Peaks, Targets, nomatch = 0L)
merge(result1, result2, by = c("PID", "TID"))[ , .SD, .SDcols = !patterns("^(min|max|i\\.)")]
Выход
PID TID Peptide.mz.x Fragment.mz.x Sequence.x Fragment.x Rank.x Label.x Fragment.Intensity.x Peptide.mz.y Fragment.mz.y Sequence.y Fragment.y Rank.y
1: 3 4 493.2224 302.145 GGPFSDSYR y3 4 light 6117.289 493.2224 302.145 GGPFSDSYR y3 4
Label.y Fragment.Intensity.y
1: light 6117.289