Здесь у меня есть модифицированный файл 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))