Использование% in% для фильтрации строк на основе хромосомы И положения - PullRequest
1 голос
/ 10 июня 2019

У меня есть два фрейма данных: один - VCF с информацией о генотипе, другой - фрейм данных "специальных" позиций SNP. Используя dplyr , я хотел бы отфильтровать VCF только для тех позиций, которые существуют в кадре данных специальных SNP, однако я не могу понять, как использовать% в% для нескольких столбцов.

VCF dataframe:

CHR   POS   REF   ALT
01    10    C     T
01    20    G     A
01    30    T     C
02    20    A     G
02    30    C     G
02    40    G     T
02    50    T     A

SPECIAL_SNP фрейм данных:

CHR   POS
01    20
01    30
02    40
02    50

Желаемый вывод:

CHR   POS   REF   ALT
01    20    G     A
01    30    T     C
02    40    G     T
02    50    T     A

Я думал о чем-то похожем на это:

VCF %>%
    filter(.[, c("CHR", "POS"] %in% SPECIAL_SNP[, c("CHR", "POS")])

Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 10 июня 2019

Мы можем использовать inner_join

library(dplyr)
inner_join(VCF, SPECIAL_SNP)
#   CHR POS REF ALT
#1   1  20   G   A
#2   1  30   T   C
#3   2  40   G   T
#4   2  50   T   A

Или другой вариант %in%

VCF[do.call(paste, VCF[1:2]) %in% do.call(paste, SPECIAL_SNP[1:2]),]

data

VCF <- structure(list(CHR = c(1L, 1L, 1L, 2L, 2L, 2L, 2L), POS = c(10L, 
20L, 30L, 20L, 30L, 40L, 50L), REF = c("C", "G", "T", "A", "C", 
"G", "T"), ALT = c("T", "A", "C", "G", "G", "T", "A")), 
  class = "data.frame", row.names = c(NA, 
-7L))

SPECIAL_SNP <- structure(list(CHR = c(1L, 1L, 2L, 2L), POS = c(20L, 30L, 40L, 
50L)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...