无法将 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))
我正在尝试使用 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))