无法将xpathApply应用于类" list"的对象在R

时间:2017-05-16 19:01:54

标签: r xml list xpath sapply

我正在尝试使用PMID列表查询PubMed,并尝试为每篇文章(例如发布类型)获取一些信息。我想最终创建一个由2列组成的数据框:一列列出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函数来获取xmlValue时,例如XML中的发布类型或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个不同的批次,似乎应该有办法做到这一点,但我被困在这里。任何建议都将非常感谢,提前谢谢!

1 个答案:

答案 0 :(得分:2)

使用lapply循环遍历嵌套列表,以检索相应的已解析XML数据。下面将返回一个长度等于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))