我正在使用 R 用一长串 PMID 查询 PubMED。因为 entrez_fetch 一次只能做一个特定的数字,所以我将我的 ~2000 个 PMID 分解为一个包含多个向量的列表(每个向量长度约为 500)。当我查询 PubMED 时,我从 XML 文件中提取每个出版物的信息。我最终想要的是这样的:
Original.PMID Publication.type
26956987 Journal.article
26956987 Meta.analysis
26956987 Multicenter.study
26402000 Journal.article
25404043 Journal.article
25404043 Meta.analysis
每个出版物都有一个唯一的 PMID,但每个 PMID 可能有多个出版物类型(如上所示)。我可以从 XML 文件中查询到 PMID 号,并且可以得到每个 PMID 的发布类型。我遇到的问题是重复PMID x 次,以便每个PMID 与其拥有的每种发布类型相关联。如果我的数据没有包含在具有多个子列表的列表中(例如,如果我有 14 个批次,每个批次作为自己的数据框),我可以通过从父 PublicationType 节点获取子节点的数量来执行此操作。但我似乎无法弄清楚如何在列表中执行此操作。
到目前为止,我的代码是这样的:
library(rvest)
library(tidyverse)
library(stringr)
library(regexr)
library(rentrez)
library(XML)
pubmed<-my.data.frame
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))
trial1<-lapply(fwd, function(x)
list(pub.type = xpathSApply(x, "//PublicationTypeList/PublicationType", xmlValue),
or.pmid = xpathSApply(x, "//ArticleId[@IdType='pubmed']", xmlValue)))
trial1 是我遇到的问题。这给了我一个列表,在每个批次中,我有一个用于 pub.type 的向量和一个用于 or.pmid 的向量,但它们的长度不同。
我试图弄清楚每个出版物有多少个儿童出版物类型,所以我可以多次重复 PMID。我目前正在使用以下代码,但它不能满足我的要求:
trial1<-lapply(fwd, function(x)
list(childnodes = xpathSApply(xmlRoot(x), "count(.//PublicationTypeList/PublicationType)", xmlChildren)))
不幸的是,这只是告诉我每个批次的子节点总数,而不是每个出版物(或 pmid)的总数。