Заменить числовой код генотипа буквой ДНК в файле VCF - PullRequest
0 голосов
/ 06 июня 2019

Здесь у меня есть модифицированный файл VCF, в котором генотип каждой последовательной строки представлен численно, а соответствующие буквы SNP находятся в списке столбца SNP (я сгенерировал этот столбец путем объединения столбцов Ref и Alt).

Используя dplyr , я хотел бы заменить числовое значение буквой SNP. Все позиции являются гомозиготными, и список SNP находится в порядке числового генотипа, поэтому при использовании первого числа числового генотипа (плюс 1) должен быть получен индекс списка соответствующей буквы SNP. Как это:

                  Ref   1st Alt   2nd Alt   3rd Alt
SNP letter:       C     A         T         G
Numeric genotype: 0     1         2         3
List index:       1     2         3         4

Измененный фрейм данных VCF:

CHR   POS   SNP              Line1   Line2   Line3
01    10    c("A", "G")      0|0     1|1     0|0
01    20    c("C", "T", "A") 2|2     0|0     1|1
02    15    c("G", "T")      1|1     0|0     1|1

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

CHR   POS   SNP              Line1   Line2   Line3
01    10    c("A", "G")      A       G       A
01    20    c("C", "T", "A") A       C       T
02    15    c("G", "T")      T       G       T

Пока я пробовал что-то вроде этого:

VCF %>%
    rowwise() %>%
    mutate_at(vars(4:ncol(.)), funs(str_replace(., "^(\\d)|\\d", SNP[[1]]["\\1"+1])))

но не увенчались успехом.

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

Структура:

VCF <- structure(list(CHR = c("01", "01", "01"), POS = c(29463, 
29517, 29522), SNP = list(c("T", "C"), c("C", "G", "A"), c("T", 
"C")), PI548298 = c("0|0", "0|0", "1|1"), PI548488 = c("0|0", "0|0", 
"0|0"), PI548348 = c("0|0", "0|0", "1|1")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L))

1 Ответ

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

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

Используя rowwise, мы применяем эту функцию к каждой строке отдельно и используем вектор SNP этой строки:

library(tidyverse)

VCF %>%
    rowwise() %>%
    mutate_at(vars(starts_with('PI')),
              list(~ SNP[as.numeric(substr(., 0, 1)) + 1]))

Source: local data frame [3 x 6]
Groups: <by row>

# A tibble: 3 x 6
  CHR     POS SNP       PI548298 PI548488 PI548348
  <chr> <dbl> <list>    <chr>    <chr>    <chr>   
1 01    29463 <chr [2]> T        T        T       
2 01    29517 <chr [3]> C        C        C       
3 01    29522 <chr [2]> C        T        C  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...