Фильтр для генов, которые содержат значительный snps - PullRequest
0 голосов
/ 08 мая 2019

У меня есть два кадра данных: список SNP с выхода GWAS и список координат начала / конца гена.Я хочу отфильтровать (используя пакет dplyr), чтобы извлечь только те гены, у которых есть SNP, чьи Position попадают в их границы начала / конца.

Я думаю, %in% может быть правильным путем, но я борюсь с тем фактом, что координаты гена представляют собой диапазон значений.Поэтому я не могу просто искать строки, в которых позиция SNP совпадает с позицией гена.

Я видел решения, использующие пакет BiomaRt и другие, но я ищу решение dplyr.Заранее спасибо.

Генерируемый фрейм данных:

Gene   Start   End
gene1  1       5
gene2  10      15
gene3  20      25
gene4  30      35

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

Position    SNP_ID
6           ss1
8           ss2
9           ss3
11          ss4
16          ss5
19          ss6
27          ss7
34          ss8

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

Gene   Start   End
gene2  10      15
gene4  30      35

1 Ответ

2 голосов
/ 08 мая 2019

Задача - определить гены, в которых есть хотя бы один SNP.Мы можем сделать это, пройдя пары позиций Start и End с map2 и спросив, попадает ли между ними какая-либо из позиций SNP:

library( tidyverse )

dfg %>% mutate( AnyHits = map2_lgl(Start, End, ~any(dfs$Position %in% seq(.x,.y))) )
# # A tibble: 4 x 4
#   Gene  Start   End AnyHits
#   <chr> <dbl> <dbl> <lgl>  
# 1 gene1     1     5 FALSE  
# 2 gene2    10    15 TRUE   
# 3 gene3    20    25 FALSE  
# 4 gene4    30    35 TRUE   

Отсюдапросто %>% filter(AnyHits) просто уменьшить ваш фрейм данных до строк, в которых было хотя бы одно попадание SNP.

Данные:

# Genes
dfg <- tibble( Gene = str_c("gene",1:4),
               Start = c(1,10,20,30),
               End = c(5,15,25,35) )

# SNPs
dfs <- tibble( Position = c(6,8,9,11,16,19,27,34),
               SNP_ID = str_c("ss",1:8) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...