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

问题描述 投票:1回答:1

亲爱的StackOverflow社区

我是一名生物学家,正在研究ClinVar官方数据库中的疾病/遗传变异。我的目的是从该列表中提取所有基因名称,转录本和变体。

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

但是,ClinVar在名为“名称”的单个列中提供了我需要的信息。 (在下表的示例中,我用一些不同的结果分隔了一些值:)

                                                           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

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

我正在寻找一种使用多个分隔符将“名称”列拆分为其他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

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

[如果有人可以帮助,请多谢!

r regex dplyr separator delimiter-separated-values
1个回答
0
投票

我试图用一个extract / separate来做到这一点,但我无法给出确切的预期输出。因此,这里尝试使用str_extract中的stringr和基数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"))
© www.soinside.com 2019 - 2024. All rights reserved.