r - 在rentrez中使用entrez_fetch解析PubMed XML

标签 r xml xpath pubmed ropensci

我正在为 PubMed 中的搜索词收集作者信息和文章信息。我正在使用 entrez_fetch 成功获取作者姓名、出版年份和其他信息在 rentrez包裹。以下是我的示例代码:

library(rentrez)
library(XML)

pubmedSearch <- entrez_search("pubmed", term = "flexible ureteroscope", retmax = 100)
SearchResults <- entrez_fetch(db="pubmed", pubmedSearch$ids, rettype="xml", parsed=TRUE)
First_Name <- xpathSApply(SearchResults, "//Author", function(x) {xmlValue(x[["ForeName"]])})
Last_Name <- xpathSApply(SearchResults, "//Author", function(x) {xmlValue(x[["LastName"]])})
PubYear <- xpathSApply(SearchResults, "//PubDate", function(x) {xmlValue(x[["Year"]])})
PMID <- xpathSApply(SearchResults, "//ArticleIdList", function(x) {xmlValue(x[["ArticleId"]])})

尽管获得了我需要的所有信息,但我在弄清楚哪些作者是哪个 PMID 时遇到了问题。这是因为每个 PMID 的作者长度不同。例如,如果我在我的代码中解析了 100 篇文章的作者信息,我会得到 100 多个作者姓名,并且我无法将其与相应的 PMID 相关联。总的来说,我想要一个像这样的输出数据框:
 PMID       First_Name   Last_Name          PubYear
 28221147   Carlos      Torrecilla Ortiz    2017
 28221147   Sergi       Colom Feixas        2017
 28208536   Dean G      Assimos             2017
 28203551   Chad M      Gridley             2017
 28203551   Bodo E      Knudsen             2017

这样,我就会知道哪些作者与哪个 PMID 相关联,这对进一步分析很有用。

只是为了说明,这是我的代码的一个小例子。我正在使用 XML 收集更多信息通过 entrez_fetch 解析在 rentrez包裹。

这个问题真的困扰着我,我真的很感激任何帮助或指导。提前感谢您的努力和帮助。

最佳答案

这实际上是一个关于 xpath(用于在 XML 文件中指定这些节点的语言)的问题,我并不声称自己是这方面的专家。但我想我可以在这种情况下提供帮助。

您希望确保一次为一条已发布的记录(PubmedArticle 条目)提取信息。您可以编写一个函数来为一条记录执行此操作

parse_paper <- function(paper){
  last_names <- xpathSApply(paper, ".//Author/LastName", xmlValue)
  first_names <- xpathSApply(paper, ".//Author/ForeName", xmlValue)
  pmid <- xpathSApply(paper, ".//ArticleId[@IdType='pubmed']", xmlValue)
  data.frame(pmid=pmid, last_names=last_names, first_names=first_names)
}

这应该给每个作者一行,每行都具有相同的 pmid。我们现在可以通过在每篇文章上调用该函数将其扩展到整篇文章。
parse_multiple_papers <- function(papers){
  res <- xpathApply(papers, "/PubmedArticleSet/*", parse_paper)
  do.call(rbind.data.frame, res)
}

head(parse_multiple_papers(SearchResults))

.
      pmid       last_names first_names
1 28221147 Torrecilla Ortiz      Carlos
2 28221147     Colom Feixas       Sergi
3 28208536          Assimos      Dean G
4 28203551          Gridley      Chad M
5 28203551          Knudsen      Bodo E
6 28101159               Li    Zhi-Gang

顺便说一句,我通常不搜索stackoverflow,但会回答有关rentrez 的任何问题。在 github repo 作为问题提交(他们不必是“错误”才能去那里)。

关于r - 在rentrez中使用entrez_fetch解析PubMed XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430519/

相关文章:

r - ggplot 设置 ylim 最小值或最大值

Rivot_longer() 输出中有 NA

xml - 是 xsi :schemaLocation actually used?

Python selenium webdriver - 无法一次通过 xpath 单击元素

c# - 正确的 XPath 会产生空结果

php - 这个 XPath 查询有什么问题?

删除 R 中给定类型的所有对象

R:加载 ggraph 时 ggplot2 出错

xml - 如何防止Dart xml包解码实体?

java - 使用 SimpleXML 反序列化多个对象中的 XML