我正在尝试使用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个不同的批次,似乎应该有办法做到这一点,但我被困在这里。任何建议都将非常感谢,提前谢谢!
答案 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))