Как устранить ошибку «невозможно найти унаследованный метод для функции» при преобразовании xml во фрейм данных? - PullRequest
0 голосов
/ 17 февраля 2020

Итак, у меня есть этот пакет и функция для извлечения фреймов данных в виде xml, и я попытался преобразовать xml в один фрейм данных, но не смог. Я использовал этот код:

library(bold)
library(XML)
library(dplyr)
xml = bold_seqspec(taxon=c("carnivora"), format = "xml", marker="COI-5P")
df= xmlToDataFrame(xml , stringsAsFactors = FALSE,) %>% 
  mutate_all(~type.convert(., as.is = T))

Однако я получаю следующую ошибку в функции "xmlToDataFrame":

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘xmlToDataFrame’ for signature ‘"xml_document", "missing", "missing", "missing", "missing"’

1 Ответ

1 голос
/ 17 февраля 2020

Проблема состоит в том, что xml находится в глубоко вложенной структуре списка с элементами переменной длины, поэтому невозможно автоматически привести его в прямоугольную структуру данных angular (т. Е. Фрейм данных).

Можно извлечь данные, которые вы хотите, различными способами, но вам нужно будет решить, какие поля вы хотите получить из каждой записи и что делать, если в одном поле несколько записей, например, c .

Я бы посоветовал вам начать с преобразования xml в список с использованием xml2::as_list и изучения его содержимого с помощью str, чтобы увидеть, какие поля вам нужны. Затем вы можете создать фрейм данных с полями, которые вы хотите для каждой записи.

Например:

library(bold)
library(XML)
library(dplyr)
xml <- bold_seqspec(taxon=c("carnivora"), format = "xml", marker="COI-5P")
df <-  xml2::as_list(xml)
df <- df$bold_records
result <- do.call(rbind, lapply(df, function(x)
{
  data.frame(specimen = x$specimen_identifiers$sampleid[[1]],
             order = x$taxonomy$order$taxon$name[[1]],
             nucleotides = x$sequences$sequence$nucleotides[[1]],
             stringsAsFactors = FALSE)
}))

Теперь result выглядит так:

tibble::as_tibble(result)
#> # A tibble: 4,577 x 3
#>    specimen   order    nucleotides                                                     
#>    <chr>      <chr>    <chr>                                                           
#>  1 T-2294     Carnivo~ ---CCTGTACCTCTTATTCGGTGCGTGAGCCGGAATGGCGGGAACCGCCCTTAGCCTACTGAT~
#>  2 HBL008245  Carnivo~ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN~
#>  3 HBL008385  Carnivo~ ACTCTTTACCTTTTATTTGGCGCATGAGCCGGAATAGTAGGCACTGCATTAAGCCTATTGATT~
#>  4 HBL008419  Carnivo~ NNTTTATATTTGCTATTCGGGGCATGAGCCGGTATAGTAGGCACTGCCCTAAGCCTCCTAATT~
#>  5 HLC-10619  Carnivo~ ACCCTTTACCTCTTATTCGGTGCATGAGCCGGAATAGTAGGAACTGCCCTCAGTCTTCTAATC~
#>  6 ROM 101864 Carnivo~ ACTCTCTACCTTCTATTCGGGGCTTGGGCTGGAATAGTGGGCACCGCTCTCAGCCTACTAATT~
#>  7 ROM 93093  Carnivo~ ACTTTGTATTTATTATTTGGAGCATGAGCCGGCATAGTAGGTACCGCCCTGAGCCTTCTTATC~
#>  8 bLpa138    Carnivo~ CCCTGCTATATCTCAATACCAAACACCCCTATTCGTCTGATCTGTTTTAATCACTGCTGTTCT~
#>  9 Fge20      Carnivo~ CCCTGCCATATCTCAATATCAAACACCTCTCTTCGTCTGATCTGTCTTAATTACTGCTGTTTT~
#> 10 bCth05     Carnivo~ TTCGCTGCCCCCTCAATAATAGGCCTTCCTATTGTAATCCTAATCATTATATTCCCATCCATT~
#> # ... with 4,567 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...