The Best R Packages in 2026: A Curated List

· 3 min read · Updated March 13, 2026 · intermediate
r packages tidyverse data-science rstats

The R package ecosystem continues to evolve rapidly. With thousands of packages on CRAN, knowing which ones to focus on can feel overwhelming. This guide cuts through the noise and highlights the packages that truly matter in 2026.

Whether you are new to R or a seasoned developer, these packages form the foundation of modern R programming.

Data Manipulation

tidyverse

The tidyverse remains the undisputed king of data manipulation in R. This collection of packages sharing a common philosophy has transformed how R developers work with data.

install.packages("tidyverse")
library(tidyverse)

# The core tidyverse includes:
# - ggplot2 (visualization)
# - dplyr (data manipulation)
# - tidyr (data tidying)
# - readr (data import)
# - purrr (functional programming)
# - tibble (tibbles)
# - stringr (strings)
# - forcats (factors)

# Example workflow
mtcars %>%
  filter(cyl == 4) %>%
  mutate(kwhp = hp / 100) %>%
  arrange(desc(kwhp)) %>%
  select(mpg, hp, kwhp)

data.table

For those dealing with massive datasets, data.table remains the performance champion:

install.packages("data.table")
library(data.table)

dt <- as.data.table(mtcars)
dt[cyl == 4, .(mpg, hp)][order(-mpg)]

The syntax is more compact than tidyverse and can be 10-100x faster on large data.

arrow and duckdb

Modern data work often spans multiple formats. Arrow provides cross-language data columns:

install.packages("arrow")
library(arrow)

# Read Parquet files directly without loading into memory
dt <- read_parquet("large_file.parquet")

DuckDB brings SQL to R for analytical queries:

install.packages("duckdb")
library(DBI)
con <- dbConnect(duckdb::duckdb())

Visualization

ggplot2

The grammar of graphics has become the standard for data visualization:

library(ggplot2)

ggplot(mtcars, aes(mpg, hp, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(title = "Cars: HP vs MPG",
       subtitle = "By cylinder count") +
  theme_minimal()

plotly

For interactive visualizations, plotly transforms ggplot2 objects:

install.packages("plotly")
library(plotly)

ggplotly(
  ggplot(mtcars, aes(mpg, hp, color = factor(cyl))) +
    geom_point()
)

Statistical Modeling

tidymodels

The tidymodels framework brings consistent modeling syntax:

install.packages("tidymodels")
library(tidymodels)

# Define a model
lm_spec <- linear_reg() %>%
  set_engine("lm")

# Fit
lm_fit <- lm_spec %>%
  fit(mpg ~ hp + wt, data = mtcars)

# Extract
tidy(lm_fit)

parsnip

Part of tidymodels, parsnip provides a unified interface across algorithms:

# Same syntax for different engines
log_spec <- logistic_reg() %>% set_engine("glm")
rf_spec <- rand_forest() %>% set_engine("ranger")

Machine Learning

caret

Despite newer alternatives, caret still serves as a unified interface for 200+ ML algorithms:

install.packages("caret")
library(caret)

model <- train(Species ~ ., data = iris, method = "rf")

xgboost and lightgbm

Gradient boosting dominates ML competitions:

install.packages("xgboost")
library(xgboost)

dtrain <- xgb.DMatrix(data = as.matrix(mtcars[, -1]), label = mtcars$mpg)
model <- xgb.train(params = list(objective = "reg:squarederror"), dtrain)

ranger and randomForest

For random forests, ranger provides speed:

install.packages("ranger")
library(ranger)

rf <- ranger(Species ~ ., data = iris, num.trees = 100)

Reporting and Documents

Quarto

Quarto has largely replaced R Markdown for publishing:

install.packages("quarto")
# Or use the CLI: quarto install

Create .qmd files that render to HTML, PDF, Word, and more.

rmarkdown

Still useful for traditional R Markdown workflows:

install.packages("rmarkdown")
library(rmarkdown)
render("report.Rmd")

gt and gtExtras

For publication-ready tables:

install.packages("gt")
library(gt)

mtcars %>%
  head() %>%
  gt() %>%
  tab_header(title = "Motor Trend Cars")

Web and APIs

httr2

Modern HTTP requests:

install.packages("httr2")
library(httr2)

req <- request("https://api.example.com") %>%
  req_headers(Authorization = "Bearer token") %>%
  req_perform()

plumber

Build REST APIs directly from R:

library(plumber)

#* @get /hello
function(name = "World") {
  list(greeting = paste0("Hello, ", name))
}

rvest

Web scraping made easy:

install.packages("rvest")
library(rvest)

page <- read_html("https://example.com")
html_elements(page, "a") %>% html_text()

Development Tools

devtools

Package development simplified:

install.packages("devtools")
library(devtools)

load_all(".")
check()
build()

testthat

Writing tests is essential:

install.packages("testthat")
library(testthat)

test_that("multiplication works", {
  expect_equal(2 * 2, 4)
})

renv

Reproducible environments:

install.packages("renv")
library(renv)

renv::init()
renv::snapshot()

Specialization Packages

lubridate

Date and time handling:

install.packages("lubridate")
library(lubridate)

ymd("2026-01-15") + weeks(2)

stringr

String manipulation:

library(stringr)

str_detect("hello world", "hello")
str_replace_all("hello", "l", "r")

forcats

Factor handling:

library(forcats)

fct_reorder(f, n) %>%
  fct_lump_n(10)

The Rising Stars

Several packages are gaining momentum in 2026:

polars

The Polars library coming to R offers blazing speed:

install.packages("polars")
library(polars)

targets

Reproducible computational pipelines:

install.packages("targets")
library(targets)

vctrs

Foundation for vector operations, increasingly important for package development.

See Also