根据 vcf 文件中的交替列重新排序变体效果

Reorder variant effects according to alternate column in vcf file

我有一个 vcf 文件,其中包含一列以逗号分隔的变异等位基因 ("alt") 和另一列及其预测效果 ("info")。 (有关示例数据框,请参见下面的 dput() 结构。)但是,无论出于何种原因,变异效应预测软件以随机顺序输出效应,而不是 "alt" 列中列出的变异的相同顺序.

我只想从每个变体效果字段中提取某些信息(真实文件在该字段中有很多我不需要的信息)并将该信息连接成逗号分隔的字符串。但是,首先,变体效应必须根据它们在 "alt" 列中的顺序重新排序。

例如,下面数据框中的第 2 行当前如下所示:

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

其中"G|intron"表示变体"G"的效果是"intron"。我希望最终输出具有预测效果,并重新排序以匹配 "alt" 列,如下所示:

   alt    info
   T,G    splice_site,intron

这样,第一个变异等位基因总是与第一个预测的效果相匹配,依此类推......顺序不能只是颠倒,因为在某些列中它们已经处于正确的顺序,或者可能有随机顺序的三个变体等...

我的想法是将 "G|intron" 变成 "key|value" 对,然后根据 "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"))

这可能不是最理想的(当然有一种方法可以分开而不是分裂氨基酸变体以保持变化类型,但我不知道),但它对你有用。

前几行代码将逗号分隔的字符串拆分为单独的项目。您可以使用 purrr::map(alt, ~ str_sort(.x)) 或类似方法对它们进行单独排序,然后取消嵌套,而不是 left_join'ing,但是加入(使用散列)对于大数据来说会更快。由于我们已将 x tibble 设置为包含列 "alt" 的部分,因此连接的 tibble 将按该顺序排列。然后我使用 group_by 并总结根据坐标(和 ref 保持它)将它们带回一个字符串。

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  

值得注意的是,在上面的代码中,我在连接中使用 {.} 来制作管道 tibble 的副本,因此我可以在连接之前修改它,这对于此操作至关重要。