PubMed検索結果を文献リストとして簡単に出力する方法 with R

Pubmed検索した結果をリスト化にしたいのですが、Pubmedのブラウザからダウンロードできるcsvファイルは情報が限られているのでいまいち。
ということで、PubmedのAPIを使えるRパッケージでリストを作成してみることにしました。

##実際の作業
1、 ターミナルからRの起動

```:Terminal
% R

R version 4.1.0 (2021-05-18) -- "Camp Pontanezen"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 
>
```
2、 パッケージのダウンロード

```:R
> if(!require("RISmed")){install.packages("RISmed")}; library(RISmed)
```
3、 パッケージの読み込み

```:R
> library(RISmed)
```

4、 検索ワードを変数SearchWordsに代入。
今回は、生殖補助医療に機械学習を応用した論文を調べてみようと思います。

```:R
> SearchWords <- "assisted reproductive technology machine learning"
```
5、検索結果を変数Resultsに代入
今回は2011年から2021年までの論文を調べてみることにしました。

```:R
> Results <- EUtilsSummary(SearchWords, type="esearch", db="pubmed", mindate=2011, maxdate=2021, retmax=1000)
```
6、何件ひっかかってきたか結果の件数だけ見てみる。

```:R
> QueryCount(Results)
[1] 69
```
7、結果をとってきて変数ResultsDataに代入

```:R
> ResultsData <- EUtilsGet(Results,type="efetch", db="pubmed")
```
8、得られた結果のclassを確認。

```:R
> class(ResultsData)
[1] "Medline"
attr(,"package")
[1] "RISmed"
```

どうやらデータフレームやリスト型ではないらしい。
S4classというのらしく、詳しくは以下のホームページに書いてありました。

https://www.rdocumentation.org/packages/RISmed/versions/2.2/topics/Medline-class

データ構造を出力し、ざっと眺めてみる。

```:R
> str(ResultsData)
Formal class 'Medline' [package "RISmed"] with 77 slots
  ..@ Query               : chr "((\"reproductive techniques, assisted\"[MeSH Terms] OR (\"reproductive\"[All Fields] AND \"techniques\"[All Fie"| __truncated__
  ..@ PMID                : chr [1:69] "34256948" "33999860" "33919350" "33725183" ...
  ..@ YearRevised         : num [1:69] 2021 2021 2021 2021 2021 ...
  ..@ MonthRevised        : num [1:69] 7 8 6 6 4 5 8 7 4 4 ...
  ..@ DayRevised          : num [1:69] 14 2 12 28 22 14 2 30 23 7 ...
  ..@ YearPubDate         : num [1:69] 2021 2021 2021 2021 2021 ...
  ..@ MonthPubDate        : chr [1:69] "Jul" "05" "Apr" "06" ...
  ..@ DayPubDate          : num [1:69] 10 17 21 NA NA NA NA NA 2 24 ...
  ..@ YearArticleDate     : num [1:69] 2021 2021 2021 2021 2021 ...
  ..@ MonthArticleDate    : num [1:69] 7 5 4 3 3 1 1 1 1 12 ...
  ..@ DayArticleDate      : num [1:69] 10 17 21 16 11 19 15 5 2 24 ...

(以下省略)
```

Pubmedに登録されているあらゆる情報が変数ResultsDataに格納されていることがわかった。
このまま全て出力すると情報量が膨大すぎるので、今回必要な情報だけを使ってデータフレームを作ります。
今回は、PMID、論文タイトル、出版年月日、アブストラクトを抽出することにしました。

```:R
> pubmed_data <- data.frame('PMID'=PMID(ResultsData),'Title'=ArticleTitle(ResultsData),'Year'=YearEntrez(ResultsData),'Month'=MonthEntrez(ResultsData),'Date'=DayEntrez(ResultsData),'Abstract'=AbstractText(ResultsData))
```
csvファイルにデータフレームを出力。

```:R
write.csv(pubmed_data,file='Pubmed_search.csv')
```

無事、リストができましたのでエクセルで見てみました。

![スクリーンショット 2021-08-04 14.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/59d4fb90-9220-9ad5-6a44-966b599bdf05.png)

完璧ですね！

##ブラウザと検索した時と結果が違う。

Rパッケージ使った時の"assisted reproductive technology machine learning"のキーワード検索結果は、以下の通り、69件。

```:R
> summary(Results)
Query:
(("reproductive techniques, assisted"[MeSH Terms] OR ("reproductive"[All Fields] AND "techniques"[All Fields] AND "assisted"[All Fields]) OR "assisted reproductive techniques"[All Fields] OR ("assisted"[All Fields] AND "reproductive"[All Fields] AND "technology"[All Fields]) OR "assisted reproductive technology"[All Fields]) AND ("machine learning"[MeSH Terms] OR ("machine"[All Fields] AND "learning"[All Fields]) OR "machine learning"[All Fields])) AND 2011[EDAT] : 2021[EDAT] 

Result count:  69> 
```

一方で、pubmedのブラウザで"assisted reproductive technology machine learning"とキーワード検索した時と結果は以下の通りで、検索結果が63件とRパッケージを使った時の69件よりも少なかった。

![スクリーンショット 2021-08-04 14.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733765/c6ae4cb7-d118-2117-bfe8-024a1bcfbf6e.png)

原因の詳細は検討してないので今後の課題とします。

##まとめ
次回からは、"キーワード"の中に検索したいキーワードをいれてRにコピペすればOK.

```:R
library(RISmed)
SearchWords <- "キーワード"
Results <- EUtilsSummary(SearchWords, type="esearch", db="pubmed", mindate=2011, maxdate=2021, retmax=1000)
ResultsData <- EUtilsGet(Results,type="efetch", db="pubmed")
pubmed_data <- data.frame('PMID'=PMID(ResultsData),'Title'=ArticleTitle(ResultsData),'Year'=YearEntrez(ResultsData),'Month'=MonthEntrez(ResultsData),'Date'=DayEntrez(ResultsData),'Abstract'=AbstractText(ResultsData))
write.csv(pubmed_data,file='Pubmed_search.csv')
```

以上です。


##参考
こちらの記事を参考にしました。
https://www.programmersought.com/article/2644693644/
https://www.rdocumentation.org/packages/RISmed/versions/2.2/topics/Medline-class