【问题标题】:R - Irregular metadata; create df from large single columnR - 不规则元数据;从大单列创建 df
【发布时间】:2020-02-25 03:34:48
【问题描述】:

标题并没有真正解决我的问题,因为可能有几种方法可以剥去这只猫的皮。但我选择了一种方法并采用了它。这就是我正在使用的:

我使用他们界面上的“发送到:”选项并下载了 .txt 文件,在 NCBI 数据库中提取了特定 study 的所有元数据。

我总共有大约 23k 个样本,每个样本都有多达 609 个独特的问题和答案,当以 .csv 格式读取时,问卷总计 8M+ 1 个变量的 obs。令我沮丧的是,元数据是不规则的。一些样本有 140 个关联的键/值对。其他人有 492。我在下面包含了一个示例的标题。

1: qiita_sid_10317:10317.BLANK1.6H.GUELPH
Identifiers: BioSample: SAMEA4790059; SRA: ERS2609990
Organism: metagenome
Attributes:
    /Alias="qiita_sid_10317:10317.BLANK1.6H.GUELPH"
    /description="American Gut control"
    /ENA checklist="ERC000011"
    /INSDC center alias="UCSDMI"
    /INSDC center name="University of California San Diego Microbiome Initiative"
    /INSDC first public="2018-07-13T17:03:10Z"
    /INSDC last update="2018-07-13T14:50:03Z"
    /INSDC status="public"
    /SRA accession="ERS2609990" 

我尝试过(包括但不限于):

  • 读取 .txt 文件(添加分隔符没有任何作用,我在这里遗漏了什么吗?)
  • 我尝试使用各种分隔符读取数据
  • 我什至删除了 Sublime Text 中的标题数据,只留下“属性:”和以“/”分隔的键/值对,以便以这种方式与列混淆
  • 我已将在 col1 中找到的所有唯一值的列拆分为可能从头开始创建 df 等。

似乎无法通过清洁步骤:

samples <- read.csv("~/biosample_result_full.txt")
samples_split <- cSplit(samples, splitCols = sample$Colname, sep = "=")
samples_split$Attributes_1 <- gsub(" ", "_", samples_split$Attributes_1)
questions <- unique(samples_split$Attributes_1)

理想情况下,每个样本和相关元数据都将转换为行,每个“属性”/问题作为列名。

非常感谢任何帮助。

【问题讨论】:

    标签: r transformation ncbi


    【解决方案1】:

    我看到您链接到的网站允许选择将数据导出到 xml。我强烈建议这样做。 R 可以非常高效地处理/解析 xml 文件。

    当我从该站点将前三个结果下载到文件 biosample_result.xml 时,使用 xml2-package 很容易处理

    library( xml2 )
    library( magrittr )
    
    doc <- read_xml( "./biosample_result.xml")
    #gret all BioSample nodes
    BioSample.Nodes <- xml_find_all( doc, "//BioSample")
    #build a data.frame
    data.frame( 
      sample_name = xml_find_first( BioSample.Nodes , ".//Id[@db='SRA']") %>% xml_text(),
      stringsAsFactors = FALSE )
    
    #   sample_name
    # 1  ERS2609990
    # 2  ERS2609989
    # 3  ERS2609988
    

    因此,如果您可以使用 XML,您只需使用正确的 xpath 语法将您需要的数据/节点放入您想要的列中...
    在上面的示例中,我(从每个 BioSample 节点中)提取了第一个 ID 节点,其属性为 db 等于 SRA,并将结果存储在 co0lumn sample_name 中。

    仍然假设您可以使用 xml-data。 如果您要将所有属性锁定到一个 df 中,则需要 purrr 中的函数,因此只需加载整个 tidyverse

    library( tidyverse )
    df <- xml_find_all( doc, "//BioSample")  %>% 
      map_df(~{
        set_names(
          xml_find_all(.x, ".//Attribute") %>% xml_text(),
          xml_find_all(.x, ".//Attribute") %>% xml_attr( "attribute_name" )
    
        ) %>% 
          as.list() %>%  
          flatten_df() 
      })
    

    会产生这样的 df

    【讨论】:

    • 添加部分以提取所有Attribute-nodes
    • 我真的感激不尽。我的机器在整套设备上都花时间,但它工作得很好:))谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2017-09-20
    • 2019-09-15
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多