Python and R Translation Cheat Sheet - Best Equivalents
The appendix of “Python and R for the Modern Data Scientist” is basically a bilingual dictionary. It runs about 40 tables long and covers everything from package management to indexing. You could spend a whole afternoon reading through it.
I’m not going to reproduce the whole thing here. But I will pull out the translations that matter most when you’re switching between languages at your desk.
The Big Picture: Data Structures
Here’s the thing about moving between Python and R. The hardest part is not syntax. It’s mapping the data structures in your head. Scavetta and Angelov lay out the equivalents in a clean table, and this one belongs on a sticky note next to your monitor:
| R Structure | Python Equivalent |
|---|---|
| Vector (1D, homogeneous) | NumPy ndarray, list, or tuple |
| Named list (heterogeneous) | Dictionary (dict) |
data.frame / tibble | Pandas DataFrame |
| Column in a data.frame | Pandas Series |
matrix or array | NumPy ndarray |
| Environment | Dictionary (dict) |
Going the other direction:
| Python Structure | R Equivalent |
|---|---|
| Scalar | One-element vector |
| List (homogeneous) | Vector |
| Tuple | Vector or list output from a function |
| Dictionary | Named list or environment |
pd.DataFrame | data.frame |
This is the table I wish someone had given me years ago. R’s vector is a strange concept if you come from Python. And Python’s dictionary is confusing if you come from R. But they map onto each other once you see it laid out.
Package Management
Both languages need you to install and load packages, but the workflow is different.
| Task | R | Python |
|---|---|---|
| Install a package | install.packages("tidyverse") | pip install pandas |
| Install specific version | devtools::install_version("ggmap", version = "3.5.2") | pip install pandas==1.1.0 |
| Load a package | library(MASS) | import pandas as pd |
| Load a function | library(readr) | from statsmodels.formula.api import ols |
Python’s import system is more granular. You can import a whole package, a module, a single function, or alias anything. R’s library() loads the whole thing. Python also has requirements.txt via pip freeze for reproducibility.
Assignment and Operators
This one trips people up. R prefers <- for assignment. Python uses =. Both work, but the conventions matter.
R also has the pipe operator %>% (from magrittr) and the native pipe |> (since R 4.1). Python doesn’t have a built-in pipe, though method chaining on DataFrames does something similar.
For arithmetic, most operators are identical. The differences:
| Operation | R | Python |
|---|---|---|
| Exponentiation | ^ or ** | ** |
| Integer division | %/% | // |
| Modulus | %% | % |
Types
R has four main atomic types: logical, integer, double, and character. Python’s equivalents are bool, int, float, and str. They line up almost perfectly, but the naming difference will confuse you when reading docs.
Functions
R uses function() with curly braces. Python uses def with indentation. One key difference: R implicitly returns the last evaluated expression. Python requires an explicit return.
# R
myFunc <- function(x) {
x * 10
}
# Python
def my_func(x):
return x * 10
Also worth noting: R uses dots and camelCase in function names (read.csv, readLines). Python uses snake_case (read_csv, read_lines). The PEP 8 style guide is strict about this. R’s style conventions are looser.
Indexing
This is where the real confusion lives. R starts indexing at 1. Python starts at 0. Every bilingual data scientist has been burned by this at least once.
But here’s the problem beyond just the starting number. Negative indices mean completely different things:
- In R,
x[-3]means “give me everything EXCEPT the third element” - In Python,
x[-3]means “give me the third element from the end”
That’s a fundamental difference. The appendix lays out the full indexing comparison across 1D and 2D structures, and it’s worth studying if you switch between languages regularly.
Logical Operators
Most relational operators are the same (==, !=, >, <). But the logical operators differ:
| Operation | R | Python |
|---|---|---|
| AND | & or && | & or and |
| OR | | or || | | or or |
| Membership | %in% | in |
| Identity check | identical() | is |
| Negation | !x | not(x) |
R also has any() and all() for checking if any or all elements of a vector are TRUE. Python has the same via NumPy: np.any() and np.all().
Final Take
The dictionary focuses on base language features, data structures, operators, and common patterns. It does not cover the higher-level ecosystem stuff like ggplot2 vs matplotlib, or dplyr vs Pandas verbs. Those comparisons live in the main chapters.
This appendix is the kind of reference you bookmark and come back to. It’s not something you read once. It’s something you keep open in a browser tab when you’re translating code between Python and R.
The most valuable parts are the data structure mappings and the indexing comparison. Those two areas cause the most confusion when switching between languages. If you work in both, print the data structure table and pin it to your wall.
This is part of a series summarizing “Python and R for the Modern Data Scientist” by Rick J. Scavetta and Boyan Angelov (O’Reilly, 2021). For the complete bilingual dictionary with all 40+ tables and code examples, grab the book.
Previous: Chapter 7 - Bilingual Case Study | Next: Closing Thoughts