Изменить порядок эффектов вариантов в соответствии с альтернативным столбцом в файле vcf

У меня есть файл vcf со столбцом с разделенными запятыми вариантными аллелями («alt») и еще одним столбцом с их прогнозируемыми эффектами («информация»). (См. Структуру dput() ниже для примера фрейма данных.) Однако по какой-либо причине программа прогнозирования вариантного эффекта выводит эффекты в случайном порядке, а не в том же порядке, в котором варианты перечислены в столбце «alt».

Я хотел бы извлечь только определенную информацию из каждого поля эффекта варианта (в реальном файле много информации в этом поле, которая мне не нужна) и объединить эту информацию в строку, разделенную запятыми. Однако сначала необходимо изменить порядок эффектов вариантов в соответствии с их порядком в столбце «alt».

Например, строка 2 в приведенном ниже фрейме данных в настоящее время выглядит следующим образом:

   alt    info
   T,G    G|intron,T|splice_site

где «G | интрон» означает, что эффект варианта «G» - «интрон». Я бы хотел, чтобы окончательный результат имел предсказанный эффект и был переупорядочен в соответствии со столбцом «alt», например:

   alt    info
   T,G    splice_site,intron

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

Моя мысль заключалась в том, чтобы превратить «G | intron» в пару «ключ | значение», а затем изменить порядок ключей в соответствии со столбцом «alt», но я изо всех сил пытаюсь понять, как это сделать. Я использую конвейер для управления фреймом данных другими способами, поэтому решение должно работать как часть канала dplyr.

Пример структуры фрейма данных:

var <- structure(list(chr = c("01", "01", "01", "01"), pos = c(10, 20, 
30, 40), ref = c("T", "A", "G", "C"), alt = c("A", "T,G", "A,C,T", 
"G"), info = c("A|missense|A2L", "G|intron,T|splice_site", "T|missense|V28R,A|missense|V28E,C|missense|V28L", 
"G|intergenic")), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

person nad7wf    schedule 19.11.2019    source источник


Ответы (1)


Это, возможно, не самый оптимальный вариант (конечно, есть способ разделиться, чтобы не разделять варианты аминокислот, чтобы остаться с типом изменения, но я этого не знаю), но он сработает для вас.

Первые несколько строк кода разделяют строки, разделенные запятыми, на отдельные элементы. Вместо left_join'ing вы можете отсортировать их по отдельности, используя purrr::map(alt, ~ str_sort(.x)) или аналогичный, а затем просто отключить, но объединение (которое использует хэш) будет быстрее для больших данных. И так как мы установили наш тиббл x как часть, включающую столбец «alt», соединенный тиббл будет в таком порядке. Затем я использую group_by и суммирую, чтобы вернуть их в одну строку в соответствии с координатами (и ссылкой, чтобы сохранить это).

library(tidyverse)
var %>% 
  mutate_at(vars(alt, info), ~ stringr::str_split(., ",")) %>% 
  left_join(
    x = {.} %>% select(-info) %>% unnest_legacy(),
    y = {.} %>% select(-alt) %>% unnest_legacy() %>% 
      separate(info, into = c("alt","info","aa_change"), sep = "\\|"),
    by = c("chr","pos","ref","alt")
  ) %>% 
  mutate(info = ifelse(is.na(aa_change),info, sprintf("%s|%s",info, aa_change))) %>% 
  group_by(
    chr, pos, ref
  ) %>% 
  summarise(
    alt = paste(alt,collapse = ","),
    info = paste(info, collapse = ",")
    )

Это дает следующее:

# A tibble: 4 x 5
# Groups:   chr, pos [4]
  chr     pos ref   alt   info                                     
  <chr> <dbl> <chr> <chr> <chr>                                    
1 01       10 T     A     missense|A2L                             
2 01       20 A     T,G   splice_site,intron                       
3 01       30 G     A,C,T missense|V28E,missense|V28L,missense|V28R
4 01       40 C     G     intergenic  

Следует отметить, что в приведенном выше коде я использую {.} в соединении, чтобы сделать копию переданного по конвейеру тибла, чтобы я мог изменить его перед присоединением, что имеет решающее значение для этой операции.

person GenesRus    schedule 19.11.2019