无法将 xpathApply 应用于 R 中 class "list" 的对象

Unable to apply xpathApply to an object of class "list" in R

我正在尝试使用 PMID 列表查询 PubMed,并尝试为每篇文章获取一些信息,例如出版物类型。我想最终创建一个由两列组成的数据框:一列列出 PMID,另一列列出发布类型。一些出版物有不止一种出版物类型,因此应该为每种出版物类型复制一个 PMID。例如:

    PMID           Publication.type
    26946365       Journal.article
    26946365       Meta.analysis
    26946365       Twin.study
    28399511       Journal.article

如果我将我的 PMID 列表分成批次并分别进行(即 batch1<-pubmed[1,500,] 等),我就可以创建它。但我想更简洁地做到这一点。我的代码是:

    library(tidyverse)
    library(stringr)
    library(regexr)
    library(rentrez)
    library(XML)

    pubmed<-df(PMID codes)

    into.batches<-function(x,n) split(x,cut(seq_along(x),n,labels=FALSE))
    batches<-into.batches(pubmed.fwd$PMID, 14)        
    headings<-lapply(1:14, function(x) {paste0("Batch",x)})
    names(batches)<-headings

    fwd<-sapply(batches, function(x) entrez_fetch(db="pubmed", id=x, rettype="xml", parsed=TRUE))

一切正常。我的问题是当我使用 xpathSApply 函数从 XML:

获取 xmlValue 时,例如发布类型或 PMID
    pub.type<-xpathSApply(fwd, "//PublicationTypeList/PublicationType", xmlValue)
    or.pmid<-xpathSApply(fwd, "//ArticleId[@IdType='pubmed']", xmlValue)

我收到以下错误:

    Error in UseMethod("xpathApply") : 
    no applicable method for 'xpathApply' applied to an object of class "list"

难道我不能这样做是因为 fwd 是一个包含 14 个不同向量的列表?我尝试使用常规 sapply 但我收到相同的错误消息。我真的希望我不必为每个功能做 14 个不同的批次,似乎应该有办法做到这一点,但我被困在这里。任何建议将不胜感激,提前致谢!

只需使用 lapply 遍历嵌套列表即可检索相应的已解析 XML 数据。下面将 return 与 fwd 等长的列表,每个项目包含 pub.type 的两个命名元素的列表or.pmid:

pubmedList <- (fwd, function(f)
    list(pub.type = xpathSApply(f, "//PublicationTypeList/PublicationType", xmlValue),
         or.pmid = xpathSApply(f, "//ArticleId[@IdType='pubmed']", xmlValue)))

或者,创建两个列表:

pub.type_List <- (fwd, function(f)
        xpathSApply(f, "//PublicationTypeList/PublicationType", xmlValue))

or.pmid_List <- (fwd, function(f)
        xpathSApply(f, "//ArticleId[@IdType='pubmed']", xmlValue))