【发布时间】:2016-12-02 18:51:44
【问题描述】:
我正在尝试创建一个与 pubmed api 交互的函数,以检索与 100 个出版物关联的 xml 文件。然后我想单独解析 xml 文件以检索每个出版物的标题和每个出版物的摘要。我正在使用 Rentrez 包与 api 交互,并已成功检索到必要的 xml 文件。我正在使用 xml 包来解析 xml 文件,并已验证 Xpath 表达式是否检索到我想要的数据。事实上,我希望从其他领域(期刊标题、网格术语等)获取数据,但我被困在这一步)
但是,我无法创建适当的 for 循环来将此数据移动到数据框中。我在运行代码时收到以下错误:
$<-.data.frame(*tmp*, "Abstract", value = list("text of abstract") 中的错误:
替换有 1 行,数据有 0
当我测试接收标题信息的函数(通过删除表达式以检索抽象信息)时,我收到一个空的数据框,其中没有关于我想要的标题的信息。但是没有错误信息。
如果我执行 pubmed_parsed("Kandel+Eric", n=2),我的目标是接收一个数据帧,其中包含来自“ATitle”列中两个标题的字符向量(标题:“Roles for small noncoding RNAs in哺乳动物大脑中反转录转座子的沉默”和“ApCPEB4,一种含有 ApCPEB 同源物的非朊病毒结构域,参与了长期促进的启动”)。并且两个摘要中的字符向量相应地出现在“摘要”列中(摘要的部分:“Piwi-interacting RNAs (piRNAs), longthought to be limited to gremlin...”、“两种药理学上不同类型的局部突触特异性需要蛋白质合成...")。
library(xml)
library(rentrez)
pubmed_parsed <- function(term, n=100){
df <- data.frame(ATitle = character(), JTitle = character(), MeshTerms = character(), Abstract = character(), FAuthor = character(), LAuthor = character(), stringsAsFactors = FALSE)
IdList <- entrez_search(db = "pubmed", term = term, retmode = "xml", retmax = n)
for (i in 1:n){
XmlFile <- entrez_fetch(db = "pubmed", id=IdList$ids[i], rettype = "xml", retmode = "xml", parsed=TRUE)
Parsed <- xmlRoot(XmlFile)
df$ATitle[i] <- xpathSApply(Parsed, "/PubmedArticleSet/PubmedArticle/MedlineCitation/Article/Title", xmlValue, simplify = FALSE)
df$Abstract[i] <- xpathSApply(Parsed, "/PubmedArticleSet/PubmedArticle/MedlineCitation/Article/Title", xmlValue, simplify = FALSE)
}
df
}
【问题讨论】:
-
请包括库声明和其他任何使此可重现所需的内容
-
我已经添加了适当的库语句,以及我希望从正确构造的“pubmed_parsed”函数中接收到的示例。谢谢。
-
注意:
library(XML)全部大写。 R 区分大小写! -
如果我们无法访问 API,请查看示例 XML 会有所帮助。为什么 xpath 表达式会重复?
-
pubmed api 对每个人都是免费的。我有重复的路径表达式以从同一出版物中检索各种信息。因此,xpath 表达式旨在检索摘要和标题信息。如果我在一个查询中检索多篇文章的书目信息,我会收到一个较大的 xml 文件,这对我来说更难正确解析。这是我首先尝试做的,但没有成功。我无法分离 xml 节点,然后分别在它们上运行路径表达式。
标签: r xml function for-loop pubmed