Rで細菌に有効な抗菌薬を探せるようにSanfordの表からデータを整形する
0. はじめに
今している仕事で、どの細菌にどの種類の抗菌薬が一般的に推奨されないのか?といったことを客観的に示す必要がありました。SanfordからはTableという形ではデータは手に入るのですが、もちろんそのままでは使えず、これをデータ処理に使えるようにするには一工夫必要でした。そこでPDFからデータを抽出して、データベースを作ってみようと思ってやってみました。例えば、アミノグリコシド系がいわゆる通性嫌気性菌であるBacteroides属には無効ですが、それを調べるためツールという感じに応用できます。
1. Sanford Antibiotics Activity Spectrum
Cairo University Specialized Pediatric HospitalのwebサイトにSanfordのpdfが貼られています。Sanfordのロゴも入っているし、正式にライセンスも契約しているのでしょうか…一応、これを使ってみます。
2. PDFを.csvに変換する
Rパッケージの{tabulizer}があるのですが、残念ながらtabulizer::extract_tablesでは上手く文字列が認識されないようです。method="stream"
が一番ましでしたが、質はあまり高くないという結果。こんなに苦労してインストールしたのに…。
tabulizer::extract_tables("~/Downloads/Sanford v2.pdf", method="stream")
時間もかかるしあまりおすすめできません。いろいろ試した結果、PDFTablesの方が綺麗に出力されていることがわかったので、PDFTablesを使っていきましょう。ウェブサイトにアクセスしてPDFを投げれば、CSVに変換されると思います。
3. .csvを読み込んで整形する
PDFTableで作成した.csvをRで取り込むと、一定のルールで列がずれてしまっているので、これを微調整してあげます。ここらへんのやり方はもっともっとスマートなやり方があると思うのですが。
library(tidyverse) read_csv("~/Downloads/Sanford v2.csv", skip=1) %>% # 1行目は抗菌薬のカテゴリ名なので消去 dplyr::rename(Bacteria=Antibacterials) %>% filter(!grepl("Aerobic|Anerobic", Bacteria)) %>% mutate_all(funs(gsub("\\*| \\*", "", .))) %>% # 細菌のカテゴリ名が格納された行を除去 mutate(X75 = if_else(is.na(X75), gsub("\\+/- ","", X74), X75)) %>% # X74とX75が連結してしまっているので修正 mutate(X74 = if_else(X74=="+/- +/-", "+/-", X74)) %>% mutate(X20 = if_else(is.na(X20), gsub("\\+/- ","", X19), X20)) %>% mutate(X19 = if_else(X19=="+/- +/-", "+/-", X19)) %>% mutate(X32 = if_else(is.na(X32), gsub("\\+/- ","", X31), X32)) %>% mutate(X31 = if_else(X31=="+/- +/-", "+/-", X31)) %>% mutate(X24 = if_else(is.na(X24), gsub("\\+/- ","", X23), X24)) %>% mutate(X23 = if_else(X23=="+/- ++", "+/-", X23)) %>% .[,1:81] -> Spectrum # 細菌と抗菌薬の情報は81列目まで
3. 抗菌薬名のベクトルを作成する
PDFTableで作成した.csvは上手く抗菌薬名が取り込まれていないので、Sanford v2.pdf
の抗菌薬名をコピペします。
Quinu-Dalfo Metronidazole Fosfomycin (po) Fosfomycin (IV) Nitrofurantoin TMP-SMX Rif (comb) Fusidic Acid Colistin Polymyxin B Tedizolid Linezolid Dalbavancin Oritavancin Telavancin Teicoplanin Vancomycin Daptomycin Tigecycline Tetracycline Minocycline Doxycycline Telithromycin Clarithromycin Azithromycin Erythromycin Clindamycin Chloramphenicol Amikacin Tobramycin Gentamicin Cefditoren Cefdinir Cefpodoxime Ceftibuten Cefixime Cefurox-Axe Cefprozil Cefaclor Cephalexin Cefadroxil Ceftol-Tazo Ceftaroline Ceftaz-Avibac Cefepime Ceftazidime Ceftriaxone Ceftizoxime Cefotaxime Cefuroxime Cefoxitin Cefotetan Cefazolin Gatifloxacin Gemifloxacin Prulifloxacin Norfloxacin Moxifloxacin Levofloxacin Ofloxacin Delafloxacin Ciprofloxacin Aztreonam Mero-Vabor Meropenem Imipenem Ertapenem Doripenem Pip-Tazo Amp-Sulb Amox-Clav Amoxicillin Ampicillin Dicloxacillin Flucloxacillin Cloxacillin Oxacillin Nafcillin Penicillin VK Penicillin G
ただ、このままだと使いにくいので
Quinu-Dalfo Metronidazole Fosfomycin(po) Fosfomycin(IV) Nitrofurantoin TMP-SMX Rif(comb) Fusidic-Acid Colistin Polymyxin-B Tedizolid Linezolid Dalbavancin Oritavancin Telavancin Teicoplanin Vancomycin Daptomycin Tigecycline Tetracycline Minocycline Doxycycline Telithromycin Clarithromycin Azithromycin Erythromycin Clindamycin Chloramphenicol Amikacin Tobramycin Gentamicin Cefditoren Cefdinir Cefpodoxime Ceftibuten Cefixime Cefurox-Axe Cefprozil Cefaclor Cephalexin Cefadroxil Ceftol-Tazo Ceftaroline Ceftaz-Avibac Cefepime Ceftazidime Ceftriaxone Ceftizoxime Cefotaxime Cefuroxime Cefoxitin Cefotetan Cefazolin Gatifloxacin Gemifloxacin Prulifloxacin Norfloxacin Moxifloxacin Levofloxacin Ofloxacin Delafloxacin Ciprofloxacin Aztreonam Mero-Vabor Meropenem Imipenem Ertapenem Doripenem Pip-Tazo Amp-Sulb Amox-Clav Amoxicillin Ampicillin Dicloxacillin Flucloxacillin Cloxacillin Oxacillin Nafcillin Penicillin-VK Penicillin-G
スペースになっているところを一部削ったり、-
で繋げてあげたりして、strsplit
で分割してあげます。これをSpectrumの行名に代入します。
"Quinu-Dalfo Metronidazole Fosfomycin(po) Fosfomycin(IV) Nitrofurantoin TMP-SMX Rif(comb) Fusidic-Acid Colistin Polymyxin-B Tedizolid Linezolid Dalbavancin Oritavancin Telavancin Teicoplanin Vancomycin Daptomycin Tigecycline Tetracycline Minocycline Doxycycline Telithromycin Clarithromycin Azithromycin Erythromycin Clindamycin Chloramphenicol Amikacin Tobramycin Gentamicin Cefditoren Cefdinir Cefpodoxime Ceftibuten Cefixime Cefurox-Axe Cefprozil Cefaclor Cephalexin Cefadroxil Ceftol-Tazo Ceftaroline Ceftaz-Avibac Cefepime Ceftazidime Ceftriaxone Ceftizoxime Cefotaxime Cefuroxime Cefoxitin Cefotetan Cefazolin Gatifloxacin Gemifloxacin Prulifloxacin Norfloxacin Moxifloxacin Levofloxacin Ofloxacin Delafloxacin Ciprofloxacin Aztreonam Mero-Vabor Meropenem Imipenem Ertapenem Doripenem Pip-Tazo Amp-Sulb Amox-Clav Amoxicillin Ampicillin Dicloxacillin Flucloxacillin Cloxacillin Oxacillin Nafcillin Penicillin-VK Penicillin-G" %>% strsplit(., " ") %>% .[[1]] %>% # Listで返ってくるので[[1]]で抽出する rev(.) -> colnames(Spectrum)[2:81] # 順序を逆転させる
3. Tidydataへの整形
これである程度綺麗なデータが整形できました。記号の意味がちょっとわかりにくいので置き換えつつ、tidyなdataにしていきます。
Spectrum %>% gather(Antibiotics, Comment, -Bacteria) %>% mutate_all(funs(as.factor)) %>% mutate(Comment=fct_recode(Comment, "Recommended"="++", "Active"="+", "Variable"="+/-", "Not Recommended"="0", "Insufficient Data"="?")) %>% arrange(Bacteria, Antibiotics) -> Spectrum2
# A tibble: 7,120 x 3 Bacteria Antibiotics Comment <fct> <fct> <fct> 1 A. baumanii Amikacin Variable 2 A. baumanii Amox-Clav Not Recommended 3 A. baumanii Amoxicillin Not Recommended 4 A. baumanii Amp-Sulb Variable 5 A. baumanii Ampicillin Not Recommended 6 A. baumanii Azithromycin Not Recommended 7 A. baumanii Aztreonam Not Recommended 8 A. baumanii Cefaclor Not Recommended 9 A. baumanii Cefadroxil Not Recommended 10 A. baumanii Cefazolin Not Recommended # ... with 7,110 more rows
4. dplyr::filter()で検索をかける
Clindamycinの使用が推奨されない細菌を検索してみましょう。ここではdplyr::filter()
を使用してますが、みなさんは好みのやり方でどうぞ。
Spectrum2 %>% filter(Antibiotics=="Clindamycin" & Comment=="Not Recommended")
# A tibble: 59 x 3 Bacteria Antibiotics Comment <fct> <fct> <fct> 1 A. baumanii Clindamycin Not Recommended 2 Aeromonas sp. Clindamycin Not Recommended 3 B. burgdoferi Clindamycin Not Recommended 4 B. cepacia Clindamycin Not Recommended 5 B. pertussis Clindamycin Not Recommended 6 Bartonella sp. Clindamycin Not Recommended 7 Brucella sp. Clindamycin Not Recommended 8 C. burnetii Clindamycin Not Recommended 9 C. difficille Clindamycin Not Recommended 10 C. freundii Clindamycin Not Recommended
という感じになりました。せっかくなのでShineyとかでアプリケーション化してみたいなーなんて思ったりしてますが、気が向いたらやります。
最後に。PDFからCSVに変換するところで行や列のズレなどが起こりうると思いますので、実際に臨床で使う場合はSanfordの原書できちんと確認してください。感染症の種類や部位などによっても推奨される薬剤は変わってくると思いますので。