Note of Pediatric Surgery

腸内細菌、R、ときどき小児外科

Rで細菌に有効な抗菌薬を探せるようにSanfordの表からデータを整形する

0. はじめに

今している仕事で、どの細菌にどの種類の抗菌薬が一般的に推奨されないのか?といったことを客観的に示す必要がありました。SanfordからはTableという形ではデータは手に入るのですが、もちろんそのままでは使えず、これをデータ処理に使えるようにするには一工夫必要でした。そこでPDFからデータを抽出して、データベースを作ってみようと思ってやってみました。例えば、アミノグリコシド系がいわゆる通性嫌気性菌であるBacteroides属には無効ですが、それを調べるためツールという感じに応用できます。

1. Sanford Antibiotics Activity Spectrum

Cairo University Specialized Pediatric HospitalのwebサイトにSanfordのpdfが貼られています。Sanfordのロゴも入っているし、正式にライセンスも契約しているのでしょうか…一応、これを使ってみます。

www.pediamcu.com

2. PDFを.csvに変換する

Rパッケージの{tabulizer}があるのですが、残念ながらtabulizer::extract_tablesでは上手く文字列が認識されないようです。method="stream"が一番ましでしたが、質はあまり高くないという結果。こんなに苦労してインストールしたのに…。

www.pediatricsurgery.site

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の原書できちんと確認してください。感染症の種類や部位などによっても推奨される薬剤は変わってくると思いますので。