Introduction
The AMR
package for R is an incredible tool for
antimicrobial resistance (AMR) data analysis, providing extensive
functionality for working with microbial and antimicrobial properties.
But what if you’re working in Python and still want to benefit from the
robust features of AMR
?
The best way is to access R directly from Python with the help of
rpy2
, a simple yet powerful Python package. You can easily
call functions from the AMR
package to process your own
data in your own Python environment. This post will guide you through
setting up rpy2
and show you how to use R functions from
AMR
in Python to supercharge your antimicrobial resistance
analysis.
What is rpy2
?
rpy2
is a Python library that allows Python users to run
R code within their Python scripts. Essentially, it acts as a bridge
between the two languages, allowing you to tap into the rich ecosystem
of R libraries (like AMR
) while maintaining the flexibility
of Python.
Setting Up rpy2
Before diving into the examples, you’ll need to install both R and
rpy2
. Here’s a step-by-step guide on setting things up.
Step 1: Install R
Ensure that R is installed on your system. R has minimal dependencies and is very simple to install:
-
Linux
- Ubuntu / Debian:
sudo apt install r-base
- Fedora:
sudo dnf install R
- CentOS/RHEL:
sudo yum install R
- Arch Linux:
sudo pacman -S r
- Ubuntu / Debian:
-
macOS (with Homebrew):
brew install r
-
Other Systems:
Visit the CRAN download page.
Step 2: Install the AMR
package in R
On Linux and macOS, open Terminal and run:
For other systems, open your R console and install the
AMR
package by running:
install.packages("AMR")
On any system, you can also install the latest development version of
the AMR
package by setting repos
to our beta
channel:
install.packages("AMR", repos = "https://msberends.r-universe.dev")
Working with AMR
in Python
Now that we have rpy2
set up, let’s walk through some
practical examples of using the AMR
package within
Python.
Example 1: Converting Taxonomic Data
Let’s start by converting taxonomic user input to valid taxonomy
using the AMR
package, from within Python:
import pandas as pd
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
# Load the AMR package from R
amr = importr('AMR')
# Example user dataset in Python
data = pd.DataFrame({
'microorganism': ['E. coli', 'S. aureus', 'P. aeruginosa', 'K. pneumoniae']
})
# Apply mo_name() from the AMR package to the 'microorganism' column
ro.globalenv['r_data'] = data
ro.r('r_data$mo_name <- mo_name(r_data$microorganism)')
# Retrieve and print the modified R DataFrame in Python
result = ro.r('r_data')
result = pandas2ri.rpy2py(result)
print(result)
In this example, a Python dataset with microorganism names like
E. coli and S. aureus is passed to the R function
mo_name()
. The result is an updated DataFrame
that includes the standardised microorganism names based on the
mo_name()
function from the AMR
package.
Example 2: Generating an Antibiogram
One of the core functions of the AMR
package is
generating an antibiogram, a table that summarises the antimicrobial
susceptibility of bacterial isolates. Here’s how you can generate an
antibiogram from Python:
# Run an antibiogram in R from Python
ro.r('result <- antibiogram(example_isolates, antibiotics = c(aminoglycosides(), carbapenems()))')
# Retrieve the result in Python
result = ro.r('as.data.frame(result)')
print(result)
In this example, we generate an antibiogram by selecting aminoglycosides and carbapenems, two classes of antibiotics, and then convert the resulting R data frame into a Python-readable format.
Example 3: Filtering Data Based on Gram-Negative Bacteria
Let’s say you want to filter the dataset for Gram-negative bacteria and display their resistance to certain antibiotics:
# Filter for Gram-negative bacteria with intrinsic resistance to cefotaxime
ro.r('result <- example_isolates[which(mo_is_gram_negative() & mo_is_intrinsic_resistant(ab = "cefotax")), c("bacteria", aminoglycosides(), carbapenems())]')
# Retrieve the filtered result in Python
result = ro.r('as.data.frame(result)')
print(result)
This example uses the AMR functions
mo_is_gram_negative()
and
mo_is_intrinsic_resistant()
to filter the dataset and
returns a subset of bacteria with resistance data.
Example 4: Customising the Antibiogram
You can easily customise the antibiogram by passing different antibiotics or microorganism transformations, as shown below:
# Customise the antibiogram with different settings
ro.r('result <- antibiogram(example_isolates, antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"), mo_transform = "gramstain")')
# Retrieve and print the result
result = ro.r('as.data.frame(result)')
print(result)
Here, we use piperacillin/tazobactam (TZP) in combination with tobramycin (TOB) and gentamicin (GEN) to see how they perform against various Gram-negative bacteria.
Conclusion
Using rpy2
, you can easily integrate the power of R’s
AMR
package into your Python workflows. Whether you are
generating antibiograms, analyzing resistance data, or performing
complex filtering, rpy2
gives you the flexibility to run R
code without leaving the Python environment. This makes it a perfect
solution for teams working across both R and Python.