Pubmed mit R abfragen

Author

Christian Franke

Published

February 16, 2024

Im Rahmen einer Seminararbeit wurden eine Literaturrecherche auf Pubmed durchgeführt. Unterschiedliche Search-String-Kombinationen wurden mit R automatisch ausgeführt. Dadurch haben wir ein Mengengerüst erhalten, um die Bedeutung von Subthemen besser einzuschätzen und unsere eigene Such-Strategie zu optimieren.

Das Poster zu unserer Seminararbeit findet ihr hier.

Das R-Skript hatte ich erstellt, als ich noch keine Erfahrung mit API hatte. Heute würde ich das Skript vermutlich anders (eleganter) gestalten und in den nächsten Wochen sicherlich auch als verbesserte Variante ausprobieren.

Vorbereitung

Als erstes wurde die API-Adresse als String nachgebildet mit jeweils zwei Begriffen, die im Titel oder im Abstract auf Pubmed gesucht wurden.

library(xml2)
Warning: Paket 'xml2' wurde unter R Version 4.3.2 erstellt
library(tidyr)
Warning: Paket 'tidyr' wurde unter R Version 4.3.2 erstellt
library(knitr)
Warning: Paket 'knitr' wurde unter R Version 4.3.2 erstellt
# set static values of the url
url_part_1 <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=("
url_part_3 <- "[Title/Abstract])AND("
url_part_5 <- "[Title/Abstract])"

# empty vector to store the Count-values
result_vector <- integer()
search_string_combination_1 <- character()
search_string_combination_2 <- character()

# search-strings
search_string_1 <- c(
  "COPD", "asthma", "diabetes", "heart", "hypertension", "ophthalmology"
  #, "surgery", "covid", "rehabilitation", "chronic", "acute", "icu"
)
search_string_2 <- c("telemedicine","telehealth","telemonitoring", "remote")

Bis hierhin wurde noch keine Pubmed-Abfrage durchgeführt.

Abfrage auf Pubmed

In einem doppelten Loop wurden die Such-String-Kombinationen mit paste0() zusammengesetzt, die URL aufgerufen und die Anzahl Treffer (“Count”) extrahiert.

for (i in 1:length(search_string_1)) {
  for (j in 1:length(search_string_2)) {
    # define search string
    url <- paste0(url_part_1, search_string_1[i], url_part_3, search_string_2[j], url_part_5)
    pubmed_count <- xml_integer(xml_find_all(read_xml(url), ".//Count"))
    # safe count values
    result_vector <- c(result_vector, pubmed_count)
    search_string_combination_1 <- c(search_string_combination_1, search_string_1[i])
    search_string_combination_2 <- c(search_string_combination_2, search_string_2[j])
    }
  }

Schliesslich kann das Gesamtergebnis als Tabelle ausgegeben werden.

result_set <- tibble(search_string_combination_1, search_string_combination_2, result_vector) %>%
  pivot_wider(names_from = "search_string_combination_2", values_from = "result_vector")
colnames(result_set)[1] <- "Search string combination"
kable(result_set)
Search string combination telemedicine telehealth telemonitoring remote
COPD 255 253 194 284
asthma 261 133 65 379
diabetes 1750 977 286 2235
heart 1386 669 874 5569
hypertension 601 346 297 1260
ophthalmology 525 119 4 263

Der doppelte Loop und die ursprünglichen Pubmed-Abfragen führten zu 205 unterschiedlichen Such-String-Kombinationen. Bis die Daten geladen wurden, dauert es knapp 2 Minuten. Das tönt zwar lange, aber geht schneller, als die Suchen manuell durchzuführen. Im Beispiel oben habe ich die Such-String-Kombinationen nun reduziert, sodass das Deployen schneller vonstattengeht.

Dennoch sehe ich noch Verbesserungspotential in meinem Skript. Das nehme ich mir für die nächste Zeit vor…