R - неправильные метаданные;создать DF из большого одного столбца - PullRequest
0 голосов
/ 29 октября 2019

Название не совсем соответствует моему вопросу, потому что, возможно, есть несколько способов снять шкуру с этой кошки. Но я выбрал один подход и пошел с ним. Вот с чем я работаю:

Я извлек все метаданные для конкретного исследования в базе данных NCBI, используя опцию «Отправить:» в их интерфейсе и загрузивTXT-файл

В общей сложности у меня ~ 23k выборок, каждая из которых содержит до 609 уникальных вопросов и ответов из вопросника на общую сумму 8M + obs 1 переменной при чтении в формате .csv. К моему ужасу, метаданные нерегулярны. Некоторые образцы имеют 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)

В идеале, каждый образец и связанный с нимметаданные будут преобразованы в строки с каждым «Атрибутом» / вопросом в качестве имени столбца.

This

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 30 октября 2019

Я вижу, что веб-сайт, на который вы ссылаетесь, позволяет экспортировать данные в 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, и результат сохранен в параллельном столбце sample_name.

Все еще предполагается, что вы можете использовать xml-данные. Если вы смотрите на все атрибуты в одном 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, подобный этому enter image description here

...