寻找如何在 R 中使用带有多个分隔符的 separate() (ClinVar 变体数据处理)

Looking for how to use separate() with multiple separators in R (ClinVar variant data dealing)

尊敬的 Whosebug 社区

我是一名生物学家,我正在研究来自 ClinVar 官方数据库的 disease/genetic 变体。我的目标是从此列表中提取所有基因名称、转录本和变体。

ftp://ftp.ncbi.nlm.nih.gov/pub/clinvar/xml/ClinVarFullRelease_2020-01.xml.gz

但是,ClinVar 在一个名为 "Name" 的专栏中提供了我需要的信息。 (在下面的 table 示例中,我将一些具有不同结果的值分开:)

                                                           Name ClinicalSignificance
1                                        NG_012236.2:g.11027del           Pathogenic
2                    NM_018077.3(RBM28):c.1052T>C (p.Leu351Pro)           Pathogenic
3                                         NC_012920.1:m.7445A>G           Pathogenic
4                                                     m.7510T>C           Pathogenic
5 NC_000023.11:g.(134493178_134493182)_(134501172_134501176)del           Pathogenic

(还有其他类型的数据,但由于它不包含我需要的信息,我将其视为垃圾)

我正在寻找一种使用多个分隔符将 "Name" 列拆分为其他 3 列的方法。我试过使用“|”作为我的多个匹配的正则表达式参数的一部分。但是,每次它工作时,将已经分离的数据发送到右边的列。 我的代码:

ClinVar_Clean <- separate(ClinVar_Clean, Name, into = c("Transcript","gene.var"),sep = "(?<=\.[0-9]{1,2})[(]|(?<=[0-9]{3,16}\.[0-9]{1,2}):|(?=[cmpng]\.)")
ClinVar_Clean <- separate(ClinVar_Clean, gene.var, into = c("Gene","Variant"),sep = "\):|(?=[cmpng]\.)")

我的结果:

    Transcript  Gene   Variant ClinicalSignificance
1  NG_012236.2            <NA>           Pathogenic
2  NM_018077.3 RBM28                     Pathogenic
3  NC_012920.1            <NA>           Pathogenic
4                    m.7510T>C           Pathogenic
5 NC_000023.11            <NA>           Pathogenic

结果应该是这样的:

    Transcript      Gene   Variant                                                  ClinicalSignificance
1  NG_012236.2              g.11027del                                                  Pathogenic
2  NM_018077.3      RBM28   c.1052T>C (p.Leu351Pro)                                     Pathogenic
3  NC_012920.1              m.7445A>G                                                   Pathogenic
4                           m.7510T>C                                                   Pathogenic
5  NC_000023.11             g.(134493178_134493182)_(134501172_134501176)del            Pathogenic

我也尝试单独执行每个分隔符,而不是将数据向右移动,但是它也会覆盖剩余的数据。

如果有人能帮上忙,不胜感激!

我试图用一个 extract/separate 来做到这一点,但我想不出哪个能给出准确的预期输出。因此,这里尝试使用来自 stringrstr_extract 和来自 base R 的 sub 将其分解为单独的步骤。

library(dplyr)
library(stringr)

df %>%
  mutate(Transcript = str_extract(Name, ".*(?<=:)"), 
         Gene = str_extract(Transcript, "(?<=\().*(?=\))"), 
         Variant = sub(".*:(.*)", "\1", Name)) %>%
  select(Transcript, Gene, Variant)

#           Transcript  Gene                                          Variant
#1        NG_012236.2:  <NA>                                       g.11027del
#2 NM_018077.3(RBM28): RBM28                           c.1052T>C(p.Leu351Pro)
#3        NC_012920.1:  <NA>                                        m.7445A>G
#4                <NA>  <NA>                                        m.7510T>C
#5       NC_000023.11:  <NA> g.(134493178_134493182)_(134501172_134501176)del

Transcript 中,我们捕获冒号之前的所有内容。

对于Gene,我们得到Transcript中括号内的字符。

对于Variant,我们得到冒号后的所有内容。

数据

df <- structure(list(Name = structure(c(4L, 5L, 3L, 1L, 2L), .Label = c("m.7510T>C",
"NC_000023.11:g.(134493178_134493182)_(134501172_134501176)del", 
"NC_012920.1:m.7445A>G", "NG_012236.2:g.11027del", 
"NM_018077.3(RBM28):c.1052T>C(p.Leu351Pro)"
), class = "factor"), ClinicalSignificance = structure(c(1L, 
1L, 1L, 1L, 1L), .Label = "Pathogenic", class = "factor")), class = 
"data.frame", row.names = c("1", "2", "3", "4", "5"))