【问题标题】:R: Split multiple rows into a list element based on patternR:根据模式将多行拆分为列表元素
【发布时间】:2021-06-01 17:51:07
【问题描述】:

我正在尝试在 R 中解析这个 .txt 文件:https://ftp.expasy.org/databases/cellosaurus/cellosaurus.txt

它本质上是一个大约 200 万行的单列数据框,每个实体由多行描述,并由包含字符串“//”的行记录。

理想情况下,我可以通过在“//”处拆分来捕获由多行组成的每个实体作为列表元素,但我不确定最有效的方法。

非常感谢任何帮助。

编辑:

这是我正在使用的东西的 sn-p:

[87] "//"                                                                                                                                                                                             
 [88] "ID   #40a"                                                                                                                                                                                      
 [89] "AC   CVCL_IW91"                                                                                                                                                                                 
 [90] "DR   Wikidata; Q54422071"                                                                                                                                                                       
 [91] "RX   PubMed=28159921;"                                                                                                                                                                          
 [92] "CC   Characteristics: Established from parent cell line after two passages in the peritoneal cavity of C57BL/6 mice (PubMed=28159921)."                                                         
 [93] "CC   Transformant: ChEBI; CHEBI:46666; Crocidolite asbestos."                                                                                                                                   
 [94] "CC   Derived from metastatic site: Peritoneum."                                                                                                                                                 
 [95] "CC   Breed/subspecies: C57BL/6."                                                                                                                                                                
 [96] "DI   NCIt; C21619; Mouse mesothelioma"                                                                                                                                                          
 [97] "OX   NCBI_TaxID=10090; ! Mus musculus"                                                                                                                                                          
 [98] "HI   CVCL_IW90 ! 40"                                                                                                                                                                            
 [99] "SX   Male"                                                                                                                                                                                      
[100] "AG   1-2M"                                                                                                                                                                                      
[101] "CA   Cancer cell line"                                                                                                                                                                          
[102] "DT   Created: 15-05-17; Last updated: 02-07-20; Version: 3"                                                                                                                                     
[103] "//"                                                                                                                                                                                             
[104] "ID   #490"                                                                                                                                                                                      
[105] "AC   CVCL_B375"                                                                                                                                                                                 
[106] "SY   490; Mab 7; Mab7"                                                                                                                                                                          
[107] "DR   CLO; CLO_0001018"                                                                                                                                                                          
[108] "DR   ATCC; HB-12029"                                                                                                                                                                            
[109] "DR   Wikidata; Q54422073"                                                                                                                                                                       
[110] "RX   Patent=US5616470;"                                                                                                                                                                         
[111] "CC   Monoclonal antibody isotype: IgM, kappa."                                                                                                                                                  
[112] "CC   Monoclonal antibody target: Cronartium ribicola antigens."                                                                                                                                 
[113] "OX   NCBI_TaxID=10090; ! Mus musculus"                                                                                                                                                          
[114] "HI   CVCL_4032 ! P3X63Ag8.653"                                                                                                                                                                  
[115] "CA   Hybridoma"                                                                                                                                                                                 
[116] "DT   Created: 06-06-12; Last updated: 12-03-20; Version: 6"                                                                                                                                     
[117] "//"                                                                                                                                                                                             
[118] "ID   #822"                                                                                                                                                                                      
[119] "AC   CVCL_X345"                                                                                                                                                                                 
[120] "SY   822; Mab 13; Mab13"                                                                                                                                                                        
[121] "DR   ATCC; HB-12030"                                                                                                                                                                            
[122] "DR   Wikidata; Q54422076"                                                                                                                                                                       
[123] "RX   Patent=US5616470;"                                                                                                                                                                         
[124] "CC   Monoclonal antibody isotype: IgM, kappa."                                                                                                                                                  
[125] "CC   Monoclonal antibody target: Cronartium ribicola antigens."                                                                                                                                 
[126] "OX   NCBI_TaxID=10090; ! Mus musculus"                                                                                                                                                          
[127] "HI   CVCL_4032 ! P3X63Ag8.653"                                                                                                                                                                  
[128] "CA   Hybridoma"                                                                                                                                                                                 
[129] "DT   Created: 17-07-14; Last updated: 12-03-20; Version: 5"                                                                                                                                     
[130] "//"               

作为补充说明,我的目标是搜索给定的加入 (AC),例如CVCL_X345,然后提取该种质的年龄 (AG) 和性别 (SX)(如果可用)。

【问题讨论】:

  • 也许您应该向我们提供几行这些数据。 ]frame,这样我们就可以理解这个模式。
  • 完成 -- 感谢您的建议。
  • 您的 PC 中有文件还是直接从网站上阅读?
  • 我在本地保存了一个正在读取的文件。
  • 抱歉,打开了另一个带有 python 标记的问题。

标签: r parsing


【解决方案1】:

这是使用data.table 的一种解决方案。

library(data.table)
dt <- fread("https://ftp.expasy.org/databases/cellosaurus/cellosaurus.txt", 
            skip=54, header=FALSE, sep='')
dt[, c("code", "content"):=tstrsplit(sub(" +", "@/@", V1), "@/@") ][, 
  `:=` (V1=NULL, ID=cumsum(code=="//")+1)]
dt <- dt[code!="//"]
dt[dt[content=="CVCL_IW91"], on="ID"][code %chin% c("SX", "AG")]
#>    code content ID i.code i.content
#> 1:   SX    Male  3     AC CVCL_IW91
#> 2:   AG    1-2M  3     AC CVCL_IW91

# or get all of them:
dcast(dt[code %in% c("SX", "AG", "AC")][, .(code, content), by=ID], ID ~ ...,
      value.var="content")
#>             ID        AC              AG     SX
#>      1:      1 CVCL_E548 Age unspecified Female
#>      2:      2 CVCL_KA96            <NA>   <NA>
#>      3:      3 CVCL_IW91            1-2M   Male
#>      4:      4 CVCL_B375            <NA>   <NA>
#>      5:      5 CVCL_X345            <NA>   <NA>
#>     ---                                        
#> 128802: 128802 CVCL_A6IX             29Y   Male
#> 128803: 128803 CVCL_ZB29             57Y Female
#> 128804: 128804 CVCL_ZB30             32Y Female
#> 128805: 128805 CVCL_A3ZF             26Y Female
#> 128806: 128806 CVCL_3449            <NA>   Male

reprex package (v2.0.0) 于 2021-06-01 创建

编辑:简要说明:

本质上,我想先在第一个空白处分割每一行。我通过用整个文本中不存在的分隔符替换它们来实现这一点(以前用grep检查过),然后使用tstrsplit根据这个分隔符将第一列V1分成两列(codecontent)。然后我删除 V1 并使用 cumsum 根据分隔线 (//) 的出现增加标识符 ID 以用自己的标识符标记每条记录。

【讨论】:

  • 这太棒了 - 谢谢!你有没有机会分解第三行发生的事情?
  • 谢谢。有关简要说明,请参阅编辑后的答案。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 2018-12-22
  • 2020-06-08
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多