【问题标题】:Subsetting data using regular expressions in R在 R 中使用正则表达式对数据进行子集化
【发布时间】:2014-05-13 23:36:11
【问题描述】:

我想从数据框中的列中提取特定信息并将其添加到同一数据框中的新列中。复杂之处在于,某些行根本没有我想要提取的信息(“UniProt:”之后的 6 个字符),而其他行则有多次出现 - 我希望这些行相应地显示,因为此列包含标识符在我的数据框中。

这是一个例子;我从我的数据框中复制了几行 Fasta.headers 列:

第 1 行:

H05C05.1c;CE43771;WBGene00019157;状态:Partially_confirmed;UniProt:H2L0A8;protein_id:CCD72193.1;>H05C05.1a;CE37385;WBGene00019157;状态:Partially_confirmed;UniProt:Q9TXU2;protein_id:CCD72188。 >

第 2 行:

C02B10.5;CE16802;WBGene00015330;状态:Partially_confirmed;UniProt:O44447;protein_id:CCD61167.1

第 3 行:

ZK1127.4;CE07643;WBGene00022851;状态:已确认;protein_id:CCD73716.1

第 4 行:

T27C4.4a;CE21211;WBGene00003025;基因座:lin-40;状态:已确认;UniProt:O61907;protein_id:CCD74255.1;>T27C4.4b;CE21212;WBGene00003025;基因座:lin-40;状态:已确认; UniProt:Q76NP4;protein_id:CCD74256.1;>T27C4.4d;CE33331;>F54F2.9;CE39158;WBGene00018836;状态:已确认;UniProt:P34454;protein_id:CCD71243.1

我希望输出是:

H2L0A8;Q9TXU2
O44447

O61907;Q76NP4;P34454

【问题讨论】:

  • 考虑在未来提供例如dput(d$Fasta.headers[1:4]) 的输出,以便人们更轻松地重新创建您的数据。
  • 我正在发布一个非常有用的正则表达式学习平台的链接:leaverou.github.io/regexplained

标签: regex r substring


【解决方案1】:

这里strapplycgsubfn package 中提取所需的字符串,从xsapply 将多个字符串折叠成一个用分号分隔的字符串:

library(gsubfn)
sapply(strapplyc(x, "UniProt:([^;]*)"), paste, collapse = ";")

给予:

[1] "H2L0A8;Q9TXU2"        "O44447"               ""                    
[4] "O61907;Q76NP4;P34454"

x 在哪里:

x <-  c("H05C05.1c;CE43771;WBGene00019157;status:Partially_confirmed;UniProt:H2L0A8;protein_id:CCD72193.1;>H05C05.1a;CE37385;WBGene00019157;status:Partially_confirmed;UniProt:Q9TXU2;protein_id:CCD72188.1",
  "C02B10.5;CE16802;WBGene00015330;status:Partially_confirmed;UniProt:O44447;protein_id:CCD61167.1",
    "ZK1127.4;CE07643;WBGene00022851;status:Confirmed;protein_id:CCD73716.1",
    "T27C4.4a;CE21211;WBGene00003025;locus:lin-40;status:Confirmed;UniProt:O61907;protein_id:CCD74255.1;>T27C4.4b;CE21212;WBGene00003025;locus:lin-40;status:Confirmed;UniProt:Q76NP4;protein_id:CCD74256.1;>T27C4.4d;CE33331;>F54F2.9;CE39158;WBGene00018836;status:Confirmed;UniProt:P34454;protein_id:CCD71243.1")

添加一些解释。

【讨论】:

    【解决方案2】:

    使用不常用的替代方法:regmatches&lt;-

    regmatches(x,gregexpr("UniProt:.{7}",x),invert=TRUE) <- ""
    gsub("UniProt:","",x)
    #[1] "H2L0A8;Q9TXU2;"
    #[2] "O44447;"
    #[3] ""
    #[4] "O61907;Q76NP4;P34454;"
    

    您还可以通过前瞻和后瞻来到达那里,将perl=TRUE 指定给正则表达式:

    sapply(regmatches(x,gregexpr("(?<=UniProt:).+?(?=;)",x,perl=TRUE)),
           paste,collapse=";")
    
    #[1] "H2L0A8;Q9TXU2"        "O44447"              
    #[3] ""                     "O61907;Q76NP4;P34454"
    

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2011-07-01
      • 2012-01-28
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多