1

R を使用して PMID の長いリストを使用して PubMED にクエリを実行しています。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)))

トライアル1は私が問題を抱えているものです。これにより、各バッチ内に pub.type のベクトルと or.pmid のベクトルがありますが、長さが異なるリストが表示されます。

パブリケーションごとにいくつの子パブリケーション タイプがあるかを把握しようとしているので、PMID をその回数繰り返すことができます。私は現在、私が望むことをしない次のコードを使用しています:

trial1<-lapply(fwd, function(x) 
  list(childnodes = xpathSApply(xmlRoot(x), "count(.//PublicationTypeList/PublicationType)", xmlChildren)))

残念ながら、これはパブリケーション (または pmid) ごとではなく、バッチごとの子ノードの総数を示しているだけです。

4

2 に答える 2

2

ArticleIdは記事ごとに一意である可能性が高く、PublicationType は記事ごとに複数ある可能性があるため、個別のベクトルではなくデータフレームを繰り返し作成することを検討してください。

具体的には、XML ドキュメントの[#]PubmedArticleノード全体でノード インデックス を使用します。これは、id とタイプの共有先祖であるためです。次に、必要な子孫への xpath を使用します。以下は、 と同じ長さのデータフレームのリストを作成しますfwd:

trial1 <- lapply(fwd, function(doc) {
  # RETRIEVE NUMBER OF ARTICLES PER EACH XML
  num_of_articles <- length(xpathSApply(doc, "//PubmedArticle"))

  # LOOP THROUGH EACH ARTICLE AND BIND XML VALUES TO DATAFRAME
  dfList <- lapply(seq(num_of_articles), function(i)
    data.frame(
     Original.PMID = xpathSApply(doc, paste0("//PubmedArticle[",i,"]/descendant::ArticleId[@IdType='pubmed']"), xmlValue),
     Publication.type = xpathSApply(doc, paste0("//PubmedArticle[",i,"]/descendant::PublicationTypeList/PublicationType"), xmlValue)
  ))

  # ROW BIND ALL DFS INTO ONE
  df <- do.call(rbind, dfList)
})

すべてのバッチにわたる最終的なマスター データフレームについてはdo.call(rbind, ...)、ループから再度実行します。

finaldf <- do.call(rbind, trial1)
于 2017-05-18T20:00:53.913 に答える