Найти пересечение совпадений с допусками для 2 переменных в 2 кадрах данных в R - PullRequest
2 голосов
/ 19 апреля 2020

Я хочу найти пересечение совпадений с допусками (Targets $ Peptide.mz * 0,001, Peaks $ Peptide.mz * 0,001) для 2 переменных ("Peptide.mz", "Fragment.mz") в 2 кадрах данных (Пики, цели) в R. Пример:

head(Peaks)

  Peptide.mz Fragment.mz Fragment.Intensity
1   493.2223    300.1186           337.3030
2   493.2223    300.1552           242.9032
3   493.2223    302.1497          6117.2886
4   493.2223    303.1449           761.4173
5   493.2223    304.1289          3185.0007
6   493.2223    304.1652           773.5249

head(Targets)

  Peptide.mz Fragment.mz  Sequence Fragment Rank Label
1   493.2223    774.3417 GGPFSDSYR       y6    2 light
2   493.2227    627.2733 GGPFSDSYR       y5    1 light
3   493.2223    540.2413 GGPFSDSYR       y4    5 light
4   493.2224    302.1450 GGPFSDSYR       y3    4 light
5   493.2223    436.2009 GGPFSDSYR       y7    3 light
6   498.2265    784.3500 GGPFSDSYR       y6    2 heavy

ожидаемый результат

 Peptide.mz.x Fragment.mz-x  Sequence Fragment Rank Label  Peptide.mz.y Fragment.mz.y Fragment.Intensity
       493.2224    302.1450 GGPFSDSYR       y3    4 light  493.2223    302.1497          6117.2886

Я не очень опытен в R и не знаю, как это сделать. Любые предложения приветствуются.

1 Ответ

1 голос
/ 20 апреля 2020

Добро пожаловать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...