Есть ли способ сгруппировать полиморфизмы между генами в обе категории генов с помощью R и функции ifelse?

У меня есть два набора данных. Один из них - это список генов, который показывает положение нуклеотидов каждого гена.

Например:

    Gene Name  Low Position   Upper Position
    Gene 1       1000           2000
    Gene 2       5000           6000

Другой набор данных - это список полиморфизмов и их нуклеотидных позиций.

Например:

           Position  Gene Location
    SNP 1   3000       NA
    SNP 2   5500       NA

Я использовал функцию ifelse в R, чтобы отсортировать свой набор данных полиморфизмов по соответствующим генам (так что SNP 2 будет иметь Gene 2 в столбце Gene Location). Я использовал следующий код:

   SampleGeneData$Gene.Name=as.character(SampleGeneData$Gene.Name)
   SampleSNPData$Gene.Location=ifelse(sapply(SampleSNPData$Position,function(p) any(SampleGeneData$Low.Position<=p&SampleGeneData$High.Position>=p)),SampleGeneData$Gene.Name,"NO")

Мне было интересно, можно ли также определить местоположение гена как оба гена, между которыми находится SNP (таким образом, SNP 1 будет иметь некоторый выход для гена 1 и гена 2 или чего-то подобного). Могу ли я сделать это с помощью функции ifelse или мне придется использовать что-то еще?


person krista    schedule 06.07.2020    source источник
comment
Как SNP 1 would have some output of "Gene 1 and Gene 2"? Можете ли вы показать ожидаемый результат?   -  person Ronak Shah    schedule 06.07.2020


Ответы (1)


вы можете использовать пакет valr для этого

library(tidyverse)
library(valr)

# data needs columns: chrom, start & end
genes <- read.table(text=" Gene  start   end
    Gene1       1000           2000
    Gene2       5000           6000", header=T) %>% 
  mutate(chrom =1)
snps <- tibble(rs=c("SNP1", "SNP2") ,start=c(3000,5500), end = c(3000,5500)+1,chrom=1)      

Определите ближайшие интервалы:

valr::bed_closest(snps, genes, overlap=T) 
# A tibble: 3 x 9
  rs.x  start.x end.x chrom Gene.y start.y end.y .overlap .dist
 <chr>    <dbl> <dbl> <dbl> <chr>    <int> <int>    <int> <int>
1 SNP1     3000  3001     1 Gene1     1000  2000        0 -1001
2 SNP2     5500  5501     1 Gene2     5000  6000        1     0
3 SNP2     5500  5501     1 Gene1     1000  2000        0 -3501

Затем вы можете преобразовать данные в соответствии с вашими потребностями, например:

valr::bed_closest(snps, genes, overlap=T) %>% 
  group_by(rs=rs.x) %>% 
  # add a filter of maximal distance if needed
  # filter(abs(.dist) <= 5000) %>%
  summarise(Genes = toString(Gene.y)) %>% 
  right_join(snps,by = "rs")
# A tibble: 2 x 5
    rs  Genes        start   end chrom
 <chr>  <chr>        <dbl> <dbl> <dbl>
1 SNP1  Gene1         3000  3001     1
2 SNP2  Gene2, Gene1  5500  5501     1

Только пересекающиеся интервалы через:

valr::bed_intersect(snps, genes) 
# A tibble: 1 x 8
rs.x  start.x end.x chrom Gene.y start.y end.y .overlap
<chr>   <dbl> <dbl> <dbl> <chr>    <int> <int>    <int>
  1 SNP2     5500  5501     1 Gene2     5000  6000        1
person Roman    schedule 06.07.2020