AMR/data-raw/reproduction_of_microorgani...

895 lines
40 KiB
R
Raw Normal View History

# ==================================================================== #
# TITLE #
# Antimicrobial Resistance (AMR) Analysis #
# #
# SOURCE #
# https://gitlab.com/msberends/AMR #
# #
# LICENCE #
# (c) 2018-2020 Berends MS, Luz CF et al. #
# #
# This R package is free software; you can freely use and distribute #
# it for both personal and commercial purposes under the terms of the #
# GNU General Public License version 2.0 (GNU GPL-2), as published by #
# the Free Software Foundation. #
# #
# We created this package for both routine data analysis and academic #
# research and it was publicly released in the hope that it will be #
# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. #
# Visit our website for more info: https://msberends.gitlab.io/AMR. #
# ==================================================================== #
2019-03-18 14:29:41 +01:00
# Reproduction of the `microorganisms` data set
# Data retrieved from the Catalogue of Life (CoL) through the Encyclopaedia of Life:
2019-02-20 00:04:48 +01:00
# https://opendata.eol.org/dataset/catalogue-of-life/
2020-03-14 14:05:43 +01:00
# https://doi.org/10.15468/rffz4x
2019-03-18 14:29:41 +01:00
# (download the resource file with a name like "Catalogue of Life yyyy-mm-dd")
# and from the Leibniz Institute DSMZ-German Collection of Microorganisms and Cell Cultures
# https://www.dsmz.de/support/bacterial-nomenclature-up-to-date-downloads.html
# (download the latest "Complete List" as xlsx file)
2019-02-20 00:04:48 +01:00
2019-02-21 23:32:30 +01:00
library(dplyr)
library(AMR)
2019-03-18 14:29:41 +01:00
# unzip and extract taxon.tab (around 1.5 GB) from the CoL archive, then:
2020-03-14 14:05:43 +01:00
# data_col <- data.table::fread("data-raw/taxon.tab")
data_col <- data.table::fread("data-raw/taxa.txt", quote = "")
2019-03-18 14:29:41 +01:00
# read the xlsx file from DSMZ (only around 2.5 MB):
2019-08-09 23:22:10 +02:00
data_dsmz <- readxl::read_xlsx("data-raw/DSMZ_bactnames.xlsx")
2019-03-18 14:29:41 +01:00
# the CoL data is over 3.7M rows:
data_col %>% freq(kingdom)
2019-02-20 00:04:48 +01:00
# Item Count Percent Cum. Count Cum. Percent
# --- ---------- ---------- -------- ----------- -------------
# 1 Animalia 2,225,627 59.1% 2,225,627 59.1%
# 2 Plantae 1,177,412 31.3% 3,403,039 90.4%
# 3 Fungi 290,145 7.7% 3,693,184 98.1%
# 4 Chromista 47,126 1.3% 3,740,310 99.3%
# 5 Bacteria 14,478 0.4% 3,754,788 99.7%
# 6 Protozoa 6,060 0.2% 3,760,848 99.9%
# 7 Viruses 3,827 0.1% 3,764,675 100.0%
# 8 Archaea 610 0.0% 3,765,285 100.0%
2019-03-18 14:29:41 +01:00
# clean data_col
data_col <- data_col %>%
as_tibble() %>%
select(col_id = taxonID,
col_id_new = acceptedNameUsageID,
fullname = scientificName,
kingdom,
phylum,
class,
order,
family,
genus,
species = specificEpithet,
subspecies = infraspecificEpithet,
rank = taxonRank,
ref = scientificNameAuthorship,
2020-03-14 14:05:43 +01:00
species_id = references)
2019-03-18 14:29:41 +01:00
data_col$source <- "CoL"
# clean data_dsmz
data_dsmz <- data_dsmz %>%
2019-02-20 00:04:48 +01:00
as_tibble() %>%
2019-03-18 14:29:41 +01:00
transmute(col_id = NA_integer_,
col_id_new = NA_integer_,
fullname = "",
# kingdom = "",
# phylum = "",
# class = "",
# order = "",
# family = "",
genus = ifelse(is.na(GENUS), "", GENUS),
species = ifelse(is.na(SPECIES), "", SPECIES),
subspecies = ifelse(is.na(SUBSPECIES), "", SUBSPECIES),
rank = ifelse(species == "", "genus", "species"),
ref = AUTHORS,
species_id = as.character(RECORD_NO),
source = "DSMZ")
# DSMZ only contains genus/(sub)species, try to find taxonomic properties based on genus and data_col
ref_taxonomy <- data_col %>%
filter(genus %in% data_dsmz$genus,
kingdom %in% c("Bacteria", "Chromista", "Archaea", "Protozoa", "Fungi"),
2019-03-18 14:29:41 +01:00
family != "") %>%
mutate(kingdom = factor(kingdom,
# in the left_join following, try Bacteria first, then Chromista, ...
levels = c("Bacteria", "Chromista", "Archaea", "Protozoa", "Fungi"),
ordered = TRUE)) %>%
arrange(kingdom) %>%
2019-03-18 14:29:41 +01:00
distinct(genus, .keep_all = TRUE) %>%
select(kingdom, phylum, class, order, family, genus)
data_dsmz <- data_dsmz %>%
left_join(ref_taxonomy, by = "genus") %>%
mutate(kingdom = "Bacteria",
phylum = ifelse(is.na(phylum), "(unknown phylum)", phylum),
class = ifelse(is.na(class), "(unknown class)", class),
order = ifelse(is.na(order), "(unknown order)", order),
family = ifelse(is.na(family), "(unknown family)", family),
)
# combine everything
data_total <- data_col %>%
bind_rows(data_dsmz)
rm(data_col)
rm(data_dsmz)
rm(ref_taxonomy)
2019-09-20 12:33:05 +02:00
mo_found_in_NL <- c("Absidia", "Acremonium", "Actinotignum", "Aedes", "Alternaria", "Anaerosalibacter", "Ancylostoma",
"Angiostrongylus", "Anisakis", "Anopheles", "Apophysomyces", "Arachnia", "Ascaris", "Aspergillus",
"Aureobacterium", "Aureobasidium", "Bacteroides", "Balantidum", "Basidiobolus", "Beauveria",
2019-09-22 17:19:59 +02:00
"Bilophilia", "Blastocystis", "Branhamella", "Brochontrix", "Brugia", "Calymmatobacterium", "Candida", "Capillaria",
2019-09-20 12:33:05 +02:00
"Capnocytophaga", "Catabacter", "Cdc", "Chaetomium", "Chilomastix", "Chryseobacterium",
"Chryseomonas", "Chrysonilia", "Cladophialophora", "Cladosporium", "Clonorchis", "Conidiobolus",
"Contracaecum", "Cordylobia", "Cryptococcus", "Curvularia", "Demodex", "Dermatobia", "Dicrocoelium",
"Dioctophyma", "Diphyllobothrium", "Dipylidium", "Dirofilaria", "Dracunculus", "Echinococcus",
"Echinostoma", "Elisabethkingia", "Enterobius", "Enteromonas", "Euascomycetes", "Exophiala",
"Exserohilum", "Fasciola", "Fasciolopsis", "Flavobacterium", "Fonsecaea", "Fusarium", "Fusobacterium",
"Giardia", "Gnathostoma", "Hendersonula", "Heterophyes", "Hymenolepis", "Hypomyces",
"Hysterothylacium", "Kloeckera", "Koserella", "Larva", "Lecythophora", "Leishmania", "Lelliottia",
"Leptomyxida", "Leptosphaeria", "Leptotrichia", "Loa", "Lucilia", "Lumbricus", "Malassezia",
"Malbranchea", "Mansonella", "Mesocestoides", "Metagonimus", "Metarrhizium", "Molonomonas",
"Mortierella", "Mucor", "Multiceps", "Mycocentrospora", "Mycoplasma", "Nanophetus", "Nattrassia",
"Necator", "Nectria", "Novospingobium", "Ochroconis", "Oesophagostomum", "Oidiodendron", "Onchocerca",
"Opisthorchis", "Opistorchis", "Paragonimus", "Paramyxovirus", "Pediculus", "Phlebotomus",
"Phocanema", "Phoma", "Phthirus", "Piedraia", "Pithomyces", "Pityrosporum", "Prevotella",
"Pseudallescheria", "Pseudoterranova", "Pulex", "Retortamonas", "Rhizomucor", "Rhizopus",
"Rhodotorula", "Salinococcus", "Sanguibacteroides", "Sarcophagidae", "Sarcoptes", "Schistosoma",
"Scolecobasidium", "Scopulariopsis", "Scytalidium", "Spirometra", "Sporobolomyces", "Stachybotrys",
"Stenotrophomononas", "Stomatococcus", "Strongyloides", "Syncephalastraceae", "Syngamus", "Taenia",
2019-09-22 17:19:59 +02:00
"Ternidens", "Torulopsis", "Toxocara", "Toxoplasma", "Treponema", "Trichinella", "Trichobilharzia", "Trichoderma",
2019-09-20 12:33:05 +02:00
"Trichomonas", "Trichophyton", "Trichosporon", "Trichostrongylus", "Trichuris", "Tritirachium",
"Trombicula", "Trypanosoma", "Tunga", "Ureaplasma", "Wuchereria")
2019-03-18 14:29:41 +01:00
MOs <- data_total %>%
2019-02-20 00:04:48 +01:00
filter(
2019-02-28 13:56:28 +01:00
(
2019-04-05 18:47:39 +02:00
# we only want all MICROorganisms and no viruses
!kingdom %in% c("Animalia", "Plantae", "Viruses")
2019-03-18 14:29:41 +01:00
# and not all fungi: Aspergillus, Candida, Trichphyton and Pneumocystis are the most important,
2019-02-28 13:56:28 +01:00
# so only keep these orders from the fungi:
& !(kingdom == "Fungi"
2019-08-09 23:22:10 +02:00
& !order %in% c("Eurotiales", "Microascales", "Mucorales", "Saccharomycetales", "Schizosaccharomycetales", "Tremellales", "Onygenales", "Pneumocystales"))
2019-02-28 13:56:28 +01:00
)
2019-03-18 14:29:41 +01:00
# or the genus has to be one of the genera we found in our hospitals last decades (Northern Netherlands, 2002-2018)
2019-09-20 12:33:05 +02:00
| genus %in% mo_found_in_NL
2019-04-05 18:47:39 +02:00
# or the taxonomic entry is old - the species was renamed
| !is.na(col_id_new)
2019-08-09 23:22:10 +02:00
) %>%
# really no Plantae (e.g. Dracunculus exist both as worm and as plant)
2019-09-18 15:46:09 +02:00
filter(kingdom != "Plantae") %>%
filter(!rank %in% c("kingdom", "phylum", "class", "order", "family", "genus"))
# include all ranks other than species for the included species
MOs <- MOs %>% bind_rows(data_total %>%
filter((kingdom %in% MOs$kingdom & rank == "kingdom")
| (phylum %in% MOs$phylum & rank == "phylum")
| (class %in% MOs$class & rank == "class")
| (order %in% MOs$order & rank == "order")
| (family %in% MOs$family & rank == "family")
| (genus %in% MOs$genus & rank == "genus")))
2019-04-05 18:47:39 +02:00
# filter old taxonomic names so only the ones with an existing reference will be kept
MOs <- MOs %>%
filter(is.na(col_id_new) | (!is.na(col_id_new) & col_id_new %in% MOs$col_id))
MOs <- MOs %>%
2019-02-20 00:04:48 +01:00
# remove text if it contains 'Not assigned' like phylum in viruses
mutate_all(~gsub("(Not assigned|\\[homonym\\]|\\[mistake\\])", "", ., ignore.case = TRUE))
2019-03-18 14:29:41 +01:00
MOs <- MOs %>%
# Only keep first author, e.g. transform 'Smith, Jones, 2011' to 'Smith et al., 2011':
mutate(authors2 = iconv(ref, from = "UTF-8", to = "ASCII//TRANSLIT"),
2019-02-22 22:12:10 +01:00
# remove leading and trailing brackets
authors2 = gsub("^[(](.*)[)]$", "\\1", authors2),
# only take part after brackets if there's a name
authors2 = ifelse(grepl(".*[)] [a-zA-Z]+.*", authors2),
gsub(".*[)] (.*)", "\\1", authors2),
authors2),
# get year from last 4 digits
lastyear = as.integer(gsub(".*([0-9]{4})$", "\\1", authors2)),
# can never be later than now
lastyear = ifelse(lastyear > as.integer(format(Sys.Date(), "%Y")),
NA,
lastyear),
# get authors without last year
authors = gsub("(.*)[0-9]{4}$", "\\1", authors2),
# remove nonsense characters from names
authors = gsub("[^a-zA-Z,'& -]", "", authors),
# remove trailing and leading spaces
authors = trimws(authors),
# only keep first author and replace all others by 'et al'
2019-03-18 14:29:41 +01:00
authors = gsub("(,| and| et| &| ex| emend\\.?) .*", " et al.", authors),
2019-02-22 22:12:10 +01:00
# et al. always with ending dot
authors = gsub(" et al\\.?", " et al.", authors),
authors = gsub(" ?,$", "", authors),
# don't start with 'sensu' or 'ehrenb'
authors = gsub("^(sensu|Ehrenb.?) ", "", authors, ignore.case = TRUE),
# no initials, only surname
authors = gsub("^([A-Z]+ )+", "", authors, ignore.case = FALSE),
# combine author and year if year is available
ref = ifelse(!is.na(lastyear),
paste0(authors, ", ", lastyear),
authors),
# fix beginning and ending
ref = gsub(", $", "", ref),
2019-10-09 10:52:19 +02:00
ref = gsub("^, ", "", ref),
ref = gsub("^(emend|et al.,?)", "", ref),
ref = trimws(ref)
2019-02-20 00:04:48 +01:00
)
2019-10-09 10:52:19 +02:00
# a lot start with a lowercase character - fix that
MOs$ref[!grepl("^d[A-Z]", MOs$ref)] <- gsub("^([a-z])", "\\U\\1", MOs$ref[!grepl("^d[A-Z]", MOs$ref)], perl = TRUE)
# specific one for the French that are named dOrbigny
MOs$ref[grepl("^d[A-Z]", MOs$ref)] <- gsub("^d", "d'", MOs$ref[grepl("^d[A-Z]", MOs$ref)])
MOs <- MOs %>% mutate(ref = gsub(" +", " ", ref))
2019-02-20 00:04:48 +01:00
2019-03-18 14:29:41 +01:00
# Remove non-ASCII characters (these are not allowed by CRAN)
2019-02-20 00:04:48 +01:00
MOs <- MOs %>%
lapply(iconv, from = "UTF-8", to = "ASCII//TRANSLIT") %>%
as_tibble(stringsAsFactors = FALSE) %>%
# remove invalid characters
mutate_all(~gsub("[\"'`]+", "", .))
2019-02-20 00:04:48 +01:00
2019-03-18 14:29:41 +01:00
# Split old taxonomic names - they refer in the original data to a new `taxonID` with `acceptedNameUsageID`
2019-02-20 00:04:48 +01:00
MOs.old <- MOs %>%
2019-03-18 14:29:41 +01:00
filter(!is.na(col_id_new),
ref != "",
source != "DSMZ") %>%
transmute(col_id,
col_id_new,
2019-02-20 00:04:48 +01:00
fullname =
trimws(
gsub("(.*)[(].*", "\\1",
stringr::str_replace(
2019-03-18 14:29:41 +01:00
string = fullname,
pattern = stringr::fixed(authors2),
2019-04-05 18:47:39 +02:00
replacement = "")) %>%
gsub(" (var|f|subsp)[.]", "", .)),
2019-03-18 14:29:41 +01:00
ref) %>%
2019-02-20 00:04:48 +01:00
filter(!is.na(fullname)) %>%
distinct(fullname, .keep_all = TRUE) %>%
arrange(col_id)
2019-09-22 17:19:59 +02:00
MO.bak <- MOs
2019-02-20 00:04:48 +01:00
MOs <- MOs %>%
2019-03-18 14:29:41 +01:00
filter(is.na(col_id_new) | source == "DSMZ") %>%
transmute(col_id,
2019-05-10 16:44:59 +02:00
fullname = trimws(case_when(rank == "family" ~ family,
rank == "order" ~ order,
rank == "class" ~ class,
rank == "phylum" ~ phylum,
rank == "kingdom" ~ kingdom,
TRUE ~ paste(genus, species, subspecies))),
2019-02-20 00:04:48 +01:00
kingdom,
phylum,
class,
order,
family,
genus = gsub(":", "", genus),
2019-03-18 14:29:41 +01:00
species,
subspecies,
rank,
ref,
species_id = gsub(".*/([a-f0-9]+)", "\\1", species_id),
source) %>%
#distinct(fullname, .keep_all = TRUE) %>%
2019-09-18 15:46:09 +02:00
filter(!grepl("unassigned", fullname, ignore.case = TRUE)) %>%
# prefer DSMZ over CoL, since that's more recent
arrange(desc(source)) %>%
distinct(kingdom, fullname, .keep_all = TRUE)
# remove all genera that have no species - they are irrelevant for microbiology and almost all from the kingdom of Animalia
to_remove <- MOs %>%
filter(!kingdom %in% c("Bacteria", "Protozoa")) %>%
group_by(kingdom, genus) %>%
count() %>%
filter(n == 1) %>%
ungroup() %>%
mutate(kingdom_genus = paste(kingdom, genus)) %>%
pull(kingdom_genus)
MOs <- MOs %>% filter(!(paste(kingdom, genus) %in% to_remove))
rm(to_remove)
2019-09-20 12:33:05 +02:00
# add CoL's col_id, source and ref from MOs.bak, for the cases where DSMZ took preference
2019-09-18 15:46:09 +02:00
MOs <- MOs %>%
mutate(kingdom_fullname = paste(kingdom, fullname)) %>%
left_join(MO.bak %>%
filter(is.na(col_id_new), !is.na(col_id)) %>%
2019-09-20 12:33:05 +02:00
transmute(col_id, species_id, source, ref, kingdom_fullname = trimws(paste(kingdom, genus, species, subspecies))),
by = "kingdom_fullname",
suffix = c("_dsmz", "_col")) %>%
mutate(col_id = col_id_col,
species_id = ifelse(!is.na(species_id_col) & ref_col == ref_dsmz,
gsub(".*/(.*)$", "\\1", species_id_col),
species_id_dsmz),
source = ifelse(!is.na(species_id_col) & ref_col == ref_dsmz,
source_col,
source_dsmz),
ref = ifelse(!is.na(species_id_col) & ref_col == ref_dsmz,
ref_col,
ref_dsmz)) %>%
2019-09-20 12:33:05 +02:00
select(-matches("(_col|_dsmz|kingdom_fullname)"))
2019-09-18 15:46:09 +02:00
MOs.old <- MOs.old %>%
# remove the ones that are in the MOs data set
filter(col_id_new %in% MOs$col_id) %>%
# and remove the ones that have the exact same fullname in the MOs data set, like Moraxella catarrhalis
left_join(MOs, by = "fullname") %>%
filter(col_id_new != col_id.y | is.na(col_id.y)) %>%
select(col_id = col_id.x, col_id_new, fullname, ref = ref.x)
# remove the records that are in MOs.old
2019-09-20 12:33:05 +02:00
sum(MOs.old$fullname %in% MOs$fullname)
2019-09-18 15:46:09 +02:00
MOs <- MOs %>% filter(!fullname %in% MOs.old$fullname)
2019-09-20 12:33:05 +02:00
sum(MOs.old$fullname %in% MOs$fullname)
2019-03-18 14:29:41 +01:00
# what characters are in the fullnames?
2019-08-09 23:22:10 +02:00
table(sort(unlist(strsplit(x = paste(MOs$fullname, collapse = ""), split = ""))))
MOs %>% filter(!fullname %like% "^[a-z ]+$") %>% View()
2019-09-18 15:46:09 +02:00
table(MOs$kingdom, MOs$rank)
table(AMR::microorganisms$kingdom, AMR::microorganisms$rank)
# set prevalence per species
MOs <- MOs %>%
mutate(prevalence = case_when(
class == "Gammaproteobacteria"
| genus %in% c("Enterococcus", "Staphylococcus", "Streptococcus")
~ 1,
2019-09-20 12:33:05 +02:00
kingdom %in% c("Archaea", "Bacteria", "Chromista", "Fungi")
& (phylum %in% c("Proteobacteria",
"Firmicutes",
"Actinobacteria",
"Sarcomastigophora")
| genus %in% mo_found_in_NL
| rank %in% c("kingdom", "phylum", "class", "order", "family"))
2019-09-18 15:46:09 +02:00
~ 2,
TRUE ~ 3
))
2019-03-18 14:29:41 +01:00
# Add abbreviations so we can easily know which ones are which ones.
# These will become valid and unique microbial IDs for the AMR package.
2019-02-20 00:04:48 +01:00
MOs <- MOs %>%
2019-09-20 12:33:05 +02:00
arrange(prevalence, genus, species, subspecies) %>%
2019-02-20 00:04:48 +01:00
group_by(kingdom) %>%
2019-05-10 16:44:59 +02:00
mutate(abbr_other = case_when(
rank == "family" ~ paste0("[FAM]_",
abbreviate(family,
minlength = 8,
use.classes = TRUE,
method = "both.sides",
strict = FALSE)),
rank == "order" ~ paste0("[ORD]_",
abbreviate(order,
minlength = 8,
use.classes = TRUE,
method = "both.sides",
strict = FALSE)),
rank == "class" ~ paste0("[CLS]_",
abbreviate(class,
minlength = 8,
use.classes = TRUE,
method = "both.sides",
strict = FALSE)),
rank == "phylum" ~ paste0("[PHL]_",
abbreviate(phylum,
minlength = 8,
use.classes = TRUE,
method = "both.sides",
strict = FALSE)),
rank == "kingdom" ~ paste0("[KNG]_", kingdom),
TRUE ~ NA_character_
)) %>%
2019-02-20 00:04:48 +01:00
# abbreviations may be same for genera between kingdoms,
2019-03-18 14:29:41 +01:00
# because each abbreviation starts with the the first character(s) of the kingdom
2019-09-20 12:33:05 +02:00
mutate(abbr_genus = abbreviate(gsub("^ae", "\u00E6\u00E6", genus, ignore.case = TRUE), # keep a starting Latin ae
2019-02-20 00:04:48 +01:00
minlength = 5,
use.classes = TRUE,
2019-09-20 12:33:05 +02:00
method = "both.sides")) %>%
2019-02-20 00:04:48 +01:00
ungroup() %>%
group_by(genus) %>%
# species abbreviations may be the same between genera
# because the genus abbreviation is part of the abbreviation
2019-09-20 12:33:05 +02:00
mutate(abbr_species = abbreviate(gsub("^ae", "\u00E6\u00E6", species),
2019-09-18 15:46:09 +02:00
minlength = 4,
use.classes = TRUE,
2019-02-20 00:04:48 +01:00
method = "both.sides")) %>%
ungroup() %>%
group_by(genus, species) %>%
2019-09-20 12:33:05 +02:00
mutate(abbr_subspecies = abbreviate(gsub("^ae", "\u00E6\u00E6", subspecies),
2019-09-18 15:46:09 +02:00
minlength = 4,
use.classes = TRUE,
2019-02-20 00:04:48 +01:00
method = "both.sides")) %>%
ungroup() %>%
# remove trailing underscores
mutate(mo = gsub("_+$", "",
2019-03-18 14:29:41 +01:00
toupper(paste(ifelse(kingdom %in% c("Animalia", "Plantae"),
substr(kingdom, 1, 2),
substr(kingdom, 1, 1)),
2019-05-10 16:44:59 +02:00
ifelse(is.na(abbr_other),
paste(abbr_genus,
abbr_species,
abbr_subspecies,
sep = "_"),
abbr_other),
2019-09-20 12:33:05 +02:00
sep = "_"))),
mo = gsub("(\u00C6|\u00E6)+", "AE", mo)) %>%
2019-02-26 12:33:26 +01:00
mutate(mo = ifelse(duplicated(.$mo),
2019-03-18 14:29:41 +01:00
# these one or two must be unique too
2019-02-26 12:33:26 +01:00
paste0(mo, "1"),
mo),
fullname = ifelse(fullname == "",
2019-02-28 13:56:28 +01:00
trimws(paste(genus, species, subspecies)),
fullname)) %>%
2019-03-18 14:29:41 +01:00
# put `mo` in front, followed by the rest
2019-05-10 16:44:59 +02:00
select(mo, everything(), -abbr_other, -abbr_genus, -abbr_species, -abbr_subspecies)
2019-02-20 00:04:48 +01:00
# add non-taxonomic entries
MOs <- MOs %>%
bind_rows(
2019-03-02 22:47:04 +01:00
# Unknowns
2019-03-18 14:29:41 +01:00
data.frame(mo = "UNKNOWN",
col_id = NA_integer_,
fullname = "(unknown name)",
kingdom = "(unknown kingdom)",
phylum = "(unknown phylum)",
class = "(unknown class)",
order = "(unknown order)",
family = "(unknown family)",
genus = "(unknown genus)",
species = "(unknown species)",
subspecies = "(unknown subspecies)",
rank = "(unknown rank)",
ref = NA_character_,
species_id = "",
source = "manually added",
2019-09-18 15:46:09 +02:00
prevalence = 1,
2019-03-18 14:29:41 +01:00
stringsAsFactors = FALSE),
2019-03-02 22:47:04 +01:00
data.frame(mo = "B_GRAMN",
col_id = NA_integer_,
2019-06-11 14:18:25 +02:00
fullname = "(unknown Gram-negatives)",
2019-03-02 22:47:04 +01:00
kingdom = "Bacteria",
phylum = "(unknown phylum)",
class = "(unknown class)",
order = "(unknown order)",
family = "(unknown family)",
2019-06-11 14:18:25 +02:00
genus = "(unknown Gram-negatives)",
2019-03-02 22:47:04 +01:00
species = "(unknown species)",
subspecies = "(unknown subspecies)",
rank = "species",
ref = NA_character_,
2019-03-18 14:29:41 +01:00
species_id = "",
source = "manually added",
2019-09-18 15:46:09 +02:00
prevalence = 1,
2019-03-02 22:47:04 +01:00
stringsAsFactors = FALSE),
data.frame(mo = "B_GRAMP",
col_id = NA_integer_,
2019-06-11 14:18:25 +02:00
fullname = "(unknown Gram-positives)",
2019-03-02 22:47:04 +01:00
kingdom = "Bacteria",
phylum = "(unknown phylum)",
class = "(unknown class)",
order = "(unknown order)",
family = "(unknown family)",
2019-06-11 14:18:25 +02:00
genus = "(unknown Gram-positives)",
2019-03-02 22:47:04 +01:00
species = "(unknown species)",
subspecies = "(unknown subspecies)",
rank = "species",
ref = NA_character_,
2019-03-18 14:29:41 +01:00
species_id = "",
source = "manually added",
2019-09-18 15:46:09 +02:00
prevalence = 1,
2019-03-02 22:47:04 +01:00
stringsAsFactors = FALSE),
data.frame(mo = "F_YEAST",
col_id = NA_integer_,
fullname = "(unknown yeast)",
kingdom = "Fungi",
phylum = "(unknown phylum)",
class = "(unknown class)",
order = "(unknown order)",
family = "(unknown family)",
genus = "(unknown genus)",
species = "(unknown species)",
subspecies = "(unknown subspecies)",
rank = "species",
ref = NA_character_,
species_id = "",
source = "manually added",
2019-09-18 15:46:09 +02:00
prevalence = 2,
stringsAsFactors = FALSE),
data.frame(mo = "F_FUNGUS",
col_id = NA_integer_,
fullname = "(unknown fungus)",
kingdom = "Fungi",
phylum = "(unknown phylum)",
class = "(unknown class)",
order = "(unknown order)",
family = "(unknown family)",
genus = "(unknown genus)",
species = "(unknown species)",
subspecies = "(unknown subspecies)",
rank = "species",
ref = NA_character_,
species_id = "",
source = "manually added",
2019-09-18 15:46:09 +02:00
prevalence = 2,
stringsAsFactors = FALSE),
2019-02-20 00:04:48 +01:00
# CoNS
MOs %>%
filter(genus == "Staphylococcus", species == "epidermidis") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_CONS", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
2019-03-18 14:29:41 +01:00
species = "coagulase-negative",
fullname = "Coagulase-negative Staphylococcus (CoNS)",
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
# CoPS
MOs %>%
filter(genus == "Staphylococcus", species == "epidermidis") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_COPS", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
2019-03-18 14:29:41 +01:00
species = "coagulase-positive",
fullname = "Coagulase-positive Staphylococcus (CoPS)",
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
# Streptococci groups A, B, C, F, H, K
MOs %>%
2019-03-18 14:29:41 +01:00
filter(genus == "Streptococcus", species == "pyogenes") %>% .[1,] %>%
# we can keep all other details, since S. pyogenes is the only member of group A
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPA", mo),
2019-02-20 00:04:48 +01:00
species = "group A" ,
2019-09-18 15:46:09 +02:00
fullname = "Streptococcus group A",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
2019-03-18 14:29:41 +01:00
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
# we can keep all other details, since S. agalactiae is the only member of group B
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPB", mo),
2019-02-20 00:04:48 +01:00
species = "group B" ,
2019-09-18 15:46:09 +02:00
fullname = "Streptococcus group B",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
2019-03-18 14:29:41 +01:00
filter(genus == "Streptococcus", species == "dysgalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPC", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "group C" ,
fullname = "Streptococcus group C",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPD", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "group D" ,
fullname = "Streptococcus group D",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPF", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "group F" ,
fullname = "Streptococcus group F",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPG", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
2019-03-18 14:29:41 +01:00
species = "group G" ,
2019-02-20 00:04:48 +01:00
fullname = "Streptococcus group G",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPH", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "group H" ,
fullname = "Streptococcus group H",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_GRPK", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "group K" ,
fullname = "Streptococcus group K",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-02-20 00:04:48 +01:00
# Beta haemolytic Streptococci
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_HAEM", mo),
2019-02-20 00:04:48 +01:00
col_id = NA_integer_,
species = "beta-haemolytic" ,
fullname = "Beta-haemolytic Streptococcus",
2019-03-18 14:29:41 +01:00
ref = NA_character_,
species_id = "",
2019-06-13 14:28:46 +02:00
source = "manually added"),
2019-08-13 16:15:08 +02:00
# Viridans Streptococci
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_VIRI", mo),
2019-08-13 16:15:08 +02:00
col_id = NA_integer_,
species = "viridans" ,
fullname = "Viridans Group Streptococcus (VGS)",
ref = NA_character_,
species_id = "",
source = "manually added"),
# Milleri Streptococci
MOs %>%
filter(genus == "Streptococcus", species == "agalactiae") %>% .[1,] %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_MILL", mo),
2019-08-13 16:15:08 +02:00
col_id = NA_integer_,
species = "milleri" ,
fullname = "Milleri Group Streptococcus (MGS)",
ref = NA_character_,
species_id = "",
source = "manually added"),
2019-09-22 17:19:59 +02:00
# Blastocystis hominis does not exist (it means 'got a Bastocystis from humans', PMID 15634993)
# but let's be nice to the clinical people in microbiology
MOs %>%
filter(fullname == "Blastocystis") %>%
mutate(mo = paste0(mo, "_HMNS"),
fullname = paste(fullname, "hominis"),
species = "hominis",
col_id = NA,
source = "manually added",
ref = NA_character_,
species_id = ""),
2019-06-13 14:28:46 +02:00
# Trichomonas vaginalis is missing, same order as Dientamoeba
MOs %>%
filter(fullname == "Dientamoeba") %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*?)_.*", "\\1_THMNS", mo),
2019-06-13 14:28:46 +02:00
col_id = NA,
fullname = "Trichomonas",
family = "Trichomonadidae",
genus = "Trichomonas",
source = "manually added",
ref = "Donne, 1836",
species_id = ""),
MOs %>%
filter(fullname == "Dientamoeba fragilis") %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*?)_.*", "\\1_THMNS_VAG", mo),
2019-06-13 14:28:46 +02:00
col_id = NA,
fullname = "Trichomonas vaginalis",
family = "Trichomonadidae",
genus = "Trichomonas",
species = "vaginalis",
source = "manually added",
ref = "Donne, 1836",
species_id = ""),
MOs %>% # add family as such too
filter(fullname == "Monocercomonadidae") %>%
2019-09-18 15:46:09 +02:00
mutate(mo = gsub("(.*)_(.*)_.*", "\\1_\\2_TRCHMNDD", mo),
2019-06-13 14:28:46 +02:00
col_id = NA,
fullname = "Trichomonadidae",
family = "Trichomonadidae",
rank = "family",
genus = "",
species = "",
source = "manually added",
ref = "",
species_id = ""),
2019-02-20 00:04:48 +01:00
)
2019-10-30 23:02:50 +01:00
# Incorporate new microbial order for Gammaproteobacteria - Adeolu et al. (2016), PMID 27620848
MOs[which(MOs$family == "Enterobacteriaceae"), "family"] <- ""
MOs[which(MOs$genus %in% c("Escherichia",
"Atlantibacter",
"Biostraticola",
"Buttiauxella",
"Cedecea",
"Citrobacter",
"Cronobacter",
"Enterobacillus",
"Enterobacter",
"Franconibacter",
"Gibbsiella",
"Izhakiella",
"Klebsiella",
"Kluyvera",
"Kosakonia",
"Leclercia",
"Lelliottia",
"Mangrovibacter",
"Pluralibacter",
"Pseudocitrobacter",
"Raoultella",
"Rosenbergiella",
"Saccharobacter",
"Salmonella",
"Shigella",
"Shimwellia",
"Siccibacter",
"Trabulsiella",
"Yokenella")), "family"] <- "Enterobacteriaceae"
MOs[which(MOs$genus %in% c("Erwinia",
"Buchnera",
"Pantoea",
"Phaseolibacter",
"Tatumella",
"Wigglesworthia")), "family"] <- "Erwiniaceae"
MOs[which(MOs$genus %in% c("Pectobacterium",
"Brenneria",
"Dickeya",
"Lonsdalea",
"Sodalis")), "family"] <- "Pectobacteriaceae"
MOs[which(MOs$genus %in% c("Yersinia",
"Chania",
"Ewingella",
"Rahnella",
"Rouxiella",
"Samsonia",
"Serratia")), "family"] <- "Yersiniaceae"
MOs[which(MOs$genus %in% c("Hafnia",
"Edwardsiella",
"Obesumbacterium")), "family"] <- "Hafniaceae"
MOs[which(MOs$genus %in% c("Morganella",
"Arsenophonus",
"Cosenzaea",
"Moellerella",
"Photorhabdus",
"Proteus",
"Providencia",
"Xenorhabdus")), "family"] <- "Morganellaceae"
MOs[which(MOs$genus %in% c("Budvicia",
"Leminorella",
"Pragia")), "family"] <- "Budviciaceae"
MOs[which(MOs$family %in% c("Enterobacteriaceae",
"Erwiniaceae",
"Pectobacteriaceae",
"Yersiniaceae",
"Hafniaceae",
"Morganellaceae",
"Budviciaceae")), "order"] <- "Enterobacterales"
new_families <- MOs %>%
filter(order == "Enterobacterales") %>%
pull(family) %>%
unique()
class(MOs$mo) <- "character"
MOs <- rbind(MOs %>% filter(!(rank == "family" & fullname %in% new_families)),
AMR::microorganisms %>%
2020-03-14 14:05:43 +01:00
select(-snomed) %>%
2019-10-30 23:02:50 +01:00
filter(family == "Enterobacteriaceae" & rank == "family") %>%
rbind(., ., ., ., ., ., .) %>%
mutate(fullname = new_families,
source = "manually added",
ref = "Adeolu et al., 2016",
family = fullname, mo = paste0("B_[FAM]_",
toupper(abbreviate(new_families,
minlength = 8,
use.classes = TRUE,
method = "both.sides",
strict = FALSE)))))
MOs[which(MOs$order == "Enterobacteriales"), "order"] <- "Enterobacterales"
MOs[which(MOs$fullname == "Enterobacteriales"), "fullname"] <- "Enterobacterales"
2019-09-18 15:46:09 +02:00
MOs <- MOs %>%
group_by(kingdom) %>%
distinct(fullname, .keep_all = TRUE) %>%
2019-09-20 12:33:05 +02:00
ungroup() %>%
filter(fullname != "")
2019-02-28 13:56:28 +01:00
2019-09-22 17:19:59 +02:00
# add prevalence to old taxonomic names
2019-09-20 14:18:29 +02:00
MOs.old <- MOs.old %>%
left_join(MOs %>% select(col_id, prevalence), by = c("col_id_new" = "col_id"))
2019-02-28 13:56:28 +01:00
# everything distinct?
sum(duplicated(MOs$mo))
2019-08-09 23:22:10 +02:00
sum(duplicated(MOs$fullname))
2019-03-02 22:47:04 +01:00
colnames(MOs)
2019-02-28 13:56:28 +01:00
# here we welcome the new ones:
2019-09-22 17:19:59 +02:00
MOs %>% arrange(fullname) %>% filter(!fullname %in% AMR::microorganisms$fullname) %>% View()
MOs.old %>% arrange(fullname) %>% filter(!fullname %in% AMR::microorganisms.old$fullname) %>% View()
# and the ones we lost:
2020-03-14 14:05:43 +01:00
AMR::microorganisms %>% filter(!fullname %in% MOs$fullname) %>% View() # based on fullname
AMR::microorganisms %>% filter(!mo %in% MOs$mo) %>% View() # based on mo
AMR::microorganisms %>% filter(!mo %in% MOs$mo & !fullname %in% MOs$fullname) %>% View()
2019-08-09 23:22:10 +02:00
# and these IDs have changed:
2019-09-18 15:46:09 +02:00
old_new <- MOs %>%
mutate(kingdom_fullname = paste(kingdom, fullname)) %>%
filter(kingdom_fullname %in% (AMR::microorganisms %>% mutate(kingdom_fullname = paste(kingdom, fullname)) %>% pull(kingdom_fullname))) %>%
left_join(AMR::microorganisms %>% mutate(kingdom_fullname = paste(kingdom, fullname)) %>% select(mo, kingdom_fullname), by = "kingdom_fullname", suffix = c("_new", "_old")) %>%
2019-08-09 23:22:10 +02:00
filter(mo_new != mo_old) %>%
2019-09-18 15:46:09 +02:00
select(mo_old, mo_new, everything())
View(old_new)
# to keep all the old IDs:
2020-03-14 14:05:43 +01:00
# MOs <- MOs %>% filter(!mo %in% old_new$mo_new) %>%
# rbind(microorganisms %>%
# filter(mo %in% old_new$mo_old) %>%
# select(mo, fullname) %>%
2020-03-14 14:05:43 +01:00
# left_join(MOs %>%
# select(-mo), by = "fullname"))
# and these codes are now missing (which will throw a unit test error):
2019-09-18 15:46:09 +02:00
AMR::microorganisms.codes %>% filter(!mo %in% MOs$mo)
2019-09-22 17:19:59 +02:00
AMR::rsi_translation %>% filter(!mo %in% MOs$mo)
2020-03-14 14:05:43 +01:00
AMR:::microorganisms.translation %>% filter(!mo_new %in% MOs$mo) %>% View()
2019-09-18 15:46:09 +02:00
# this is how to fix it
microorganisms.codes <- AMR::microorganisms.codes %>%
2019-09-22 17:19:59 +02:00
left_join(MOs %>%
2019-09-18 15:46:09 +02:00
mutate(kingdom_fullname = paste(kingdom, fullname)) %>%
2020-03-14 14:05:43 +01:00
left_join(AMR::microorganisms %>%
transmute(mo, kingdom_fullname = paste(kingdom, fullname)),
by = "kingdom_fullname", suffix = c("_new", "_old")) %>%
select(mo_old, mo_new),
by = c("mo" = "mo_old")) %>%
select(code, mo = mo_new) %>%
filter(!is.na(mo))
microorganisms.codes %>% filter(!mo %in% MOs$mo)
# and for microorganisms.translation:
microorganisms.translation <- AMR:::microorganisms.translation %>%
select(mo = mo_new) %>%
left_join(AMR::microorganisms %>%
transmute(mo, kingdom_fullname = paste(kingdom, fullname)),
by = "kingdom_fullname", suffix = c("_new", "_old")) %>%
select(mo_old, mo_new)
left_join(MOs %>%
mutate(kingdom_fullname = paste(kingdom, fullname)) %>%
left_join(AMR::microorganisms %>%
transmute(mo, kingdom_fullname = paste(kingdom, fullname)),
by = "kingdom_fullname", suffix = c("_new", "_old")) %>%
2019-09-18 15:46:09 +02:00
select(mo_old, mo_new),
by = c("mo" = "mo_old")) %>%
select(code, mo = mo_new) %>%
filter(!is.na(mo))
microorganisms.codes %>% filter(!mo %in% MOs$mo)
2019-05-31 20:48:22 +02:00
2019-06-13 14:28:46 +02:00
# arrange
2019-09-22 17:19:59 +02:00
MOs <- MOs %>% arrange(fullname)
2019-06-13 14:28:46 +02:00
MOs.old <- MOs.old %>% arrange(fullname)
2019-09-18 15:46:09 +02:00
microorganisms.codes <- microorganisms.codes %>% arrange(code)
2019-06-13 14:28:46 +02:00
2019-06-22 14:49:12 +02:00
# transform
2019-06-13 14:28:46 +02:00
MOs <- as.data.frame(MOs, stringsAsFactors = FALSE)
2019-02-20 00:04:48 +01:00
MOs.old <- as.data.frame(MOs.old, stringsAsFactors = FALSE)
2019-09-18 15:46:09 +02:00
microorganisms.codes <- as.data.frame(microorganisms.codes, stringsAsFactors = FALSE)
2019-02-20 00:04:48 +01:00
class(MOs$mo) <- "mo"
2019-09-18 15:46:09 +02:00
class(microorganisms.codes$mo) <- "mo"
2019-06-22 14:49:12 +02:00
MOs$col_id <- as.integer(MOs$col_id)
MOs.old$col_id <- as.integer(MOs.old$col_id)
MOs.old$col_id_new <- as.integer(MOs.old$col_id_new)
2019-02-20 00:04:48 +01:00
2019-09-20 12:33:05 +02:00
# SAVE
### for other server
2019-02-20 00:04:48 +01:00
saveRDS(MOs, "microorganisms.rds")
saveRDS(MOs.old, "microorganisms.old.rds")
2019-09-20 12:33:05 +02:00
saveRDS(microorganisms.codes, "microorganisms.codes.rds")
### for same server
microorganisms <- MOs
microorganisms.old <- MOs.old
2020-02-09 22:04:29 +01:00
microorganisms.translation <- old_new %>% select(mo_old, mo_new) %>% as.data.frame()
2019-09-18 15:46:09 +02:00
class(microorganisms.translation$mo_old) <- "mo"
class(microorganisms.translation$mo_new) <- "mo"
2019-02-22 22:12:10 +01:00
2019-06-22 14:49:12 +02:00
# on the server, do:
2019-06-11 14:18:25 +02:00
usethis::use_data(microorganisms, overwrite = TRUE, version = 2)
usethis::use_data(microorganisms.old, overwrite = TRUE, version = 2)
2019-09-18 15:46:09 +02:00
usethis::use_data(microorganisms.codes, overwrite = TRUE, version = 2)
2019-09-20 12:33:05 +02:00
saveRDS(microorganisms.translation, file = "data-raw/microorganisms.translation.rds", version = 2) # this one will be covered in data-raw/internals.R
2019-02-28 13:56:28 +01:00
rm(microorganisms)
rm(microorganisms.old)
2019-09-18 15:46:09 +02:00
rm(microorganisms.codes)
rm(microorganisms.translation)
2019-09-20 12:33:05 +02:00
devtools::load_all(".")
# TO DO AFTER THIS
# * Rerun data-raw/reproduction_of_rsi_translation.R
# * Run unit tests