首页 > 解决方案 > xml转数据框时出现“无法找到函数的继承方法”错误如何解决?

问题描述

所以我有这个包和函数来以 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"’

标签: rxml

解决方案


问题是xml在一个深度嵌套的列表结构中,具有可变长度的成员,因此无法自动将其强制转换为矩形数据结构(即数据框)。

可以通过各种方式提取您想要的数据,但是您需要确定您想要从每条记录中获取哪些字段以及如果单个字段中有多个条目该怎么办等。

我建议您首先使用将 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

推荐阅读