我正在尝试创建一个与pubmed api交互的函数,以检索与100个出版物相关联的xml文件。然后,我想分别解析xml文件,以检索每个出版物的标题和每个出版物的摘要。我使用Rentrez包与api进行交互,并成功检索了必要的xml文件。我使用xml包来解析xml文件,并验证了Xpath表达式检索我想要的数据。事实上,我希望从其他领域获取数据(期刊标题,网格术语等,但我在这里坚持这一步)
但是,我无法创建适当的for循环来将此数据移动到数据框中。我在运行代码时收到以下错误:
<{1}}中的错误($<-.data.frame
,&#34;摘要&#34;,值=列表(&#34;摘要文本&#34;):
替换有1行,数据有0
当我测试函数接收标题信息时(通过删除表达式来检索抽象信息),我收到一个空数据框,没有关于我想要的标题的信息。但那时没有错误信息。
如果我执行pubmed_parsed(&#34; Kandel + Eric&#34;,n = 2),我的目标是接收一个数据框,其中包含来自两列标题的字符向量&#34; ATITle&#34; (标题:&#34;小型非编码RNA在哺乳动物大脑中反转录转座子沉默的作用&#34; ApCPEB4,一种含有ApCPEB同源物的非朊病毒结构域,参与了长期促进的启动和#34)。并且来自两个摘要的字符向量相应地出现在列#34;摘要&#34; (部分摘要:&#34; Piwi相互作用的RNAs(piRNA),长期以来被认为仅限于gremlin ...&#34;,&#34;突触特异性需要两种药理学上不同类型的局部蛋白质合成...&#34;。)
*tmp*
答案 0 :(得分:0)
这是获得一张桌子和一些建议的一种方法。首先,我将使用Web历史记录选项并将所有结果一起下载,而不是循环下载。
ids <- entrez_search(db = "pubmed", term = "Kandel ER", use_history = TRUE)
ids
Entrez search result with 502 hits (object contains 20 IDs and a web_history object)
Search term (as translated): Kandel ER[Author]
doc <- entrez_fetch(db="pubmed", web_history=ids$web_history, rettype="xml", retmax = 3, parsed=TRUE)
接下来,将文章放入节点集并查询以处理所有丢失和多个标记。
articles <- getNodeSet( doc, "//PubmedArticle")
length(articles)
[1] 3
articles[[1]]
<PubmedArticle>
<MedlineCitation Status="Publisher" Owner="NLM">
<PMID Version="1">27791114</PMID>
<DateCreated>
...
如果标签丢失,我通常会创建一个添加NA的函数,并使用逗号连接多个标签。
xpath2 <-function(x, path, fun = xmlValue, ...){
y <- xpathSApply(x, path, fun, ...)
ifelse(length(y) == 0, NA,
ifelse(length(y) > 1, paste(unlist(y), collapse=", "), y))
}
然后将该函数应用于节点(在xpath中具有前导点,因此它相对于该节点)。这会将多个关键字组合成逗号分隔的列表,并包含缺少关键字的第3条的NA。
sapply(articles, xpath2, ".//Keyword")
[1] "DNA methylation, behavior, endogenous siRNA, piwi-interacting RNA, transposon"
[2] "Aplysia, CPEB, CPEB4, Long-term facilitation"
[3] NA
大多数xpath应该可以正常工作
sapply(articles, xpath2, ".//PubDate/Year")
[1] "2016" "2016" "2016"
sapply(articles, xpath2, ".//ArticleId[@IdType='pmc']")
[1] "PMC5111663" "PMC5075418" NA
如果需要,您还可以使用xmlGetAttr
sapply(articles, xpath2, ".//Article", xmlGetAttr, "PubModel")
[1] "Print-Electronic" "Electronic" "Electronic"
最后,创建一个data.frame
data.frame(
ATitle = sapply(articles, xpath2, ".//ArticleTitle"),
JTitle = sapply(articles, xpath2, ".//Journal/Title"),
Keywords = sapply(articles, xpath2, ".//Keyword"),
Authors = sapply(articles, xpath2, ".//Author/LastName"),
Abstract = sapply(articles, xpath2, ".//AbstractText"))
我不确定MeSH术语发生了什么,但我只在我下载的几个示例中看到了关键字。此外,可能有几种方法可以获得第一个和最后一个作者。您可以同时获取姓氏和首字母(假设两者始终存在)并在首字母之前替换逗号以获取Author字符串。然后拆分它以获得第一个和最后一个作者,甚至打印下面的前三个。
au <- sapply(articles, xpath2, ".//Author/LastName|.//Author/Initials")
au <- gsub(",( [A-Z]+,?)", "\\1", au)
authors_etal <- function(x, authors=3, split=", *"){
y <- strsplit(x, split)
sapply(y, function(x){
if(length(x) > (authors + 1)) x <- c(x[1:authors], "et al.")
paste(x, collapse=", ")
})
}
authors_etal(au)
[1] "Nandi S, Chandramohan D, Fioriti L, et al."
[2] "Lee SH, Shim J, Cheong YH, et al."
[3] "Si K, Kandel ER"