Importing & Exporting Data

17.1 Text files

# Base R
df <- read.csv("data.csv")                       # stringsAsFactors = FALSE by default since R 4.0
df <- read.table("data.txt", header = TRUE, sep = "\t")
write.csv(df, "out.csv", row.names = FALSE)
lines <- readLines("notes.txt"); writeLines(lines, "copy.txt")

# readr (tidyverse) — faster, consistent, tibble output
library(readr)
df <- read_csv("data.csv")
df <- read_csv("data.csv", col_types = cols(id = col_integer(), date = col_date("%Y-%m-%d")),
               na = c("", "NA", "-"), skip = 1)
read_tsv("data.tsv"); read_delim("data.txt", delim = "|")
write_csv(df, "out.csv")
spec(df); problems(df)

# data.table — fastest for big files
dt <- data.table::fread("big.csv"); data.table::fwrite(dt, "out.csv")

# vroom — lazy, very fast
vroom::vroom("big.csv")

17.2 Excel, SPSS, Stata, SAS

library(readxl); excel_sheets("file.xlsx"); read_excel("file.xlsx", sheet = "Sales", range = "A1:D100")
writexl::write_xlsx(df, "out.xlsx")
openxlsx2::wb_workbook()            # formatted Excel output
library(haven); read_sav("survey.sav"); read_dta("data.dta"); read_sas("data.sas7bdat"); write_dta(df, "out.dta")

17.3 R native formats

saveRDS(df, "df.rds"); df <- readRDS("df.rds")        # single object (recommended)
save(df, model, file = "objs.RData"); load("objs.RData")   # multiple objects
qs2::qs_save(df, "df.qs2")                            # fast serialization

17.4 Columnar & big-data formats

arrow::write_parquet(df, "df.parquet"); arrow::read_parquet("df.parquet")
arrow::write_feather(df, "df.feather")
nanoparquet::read_parquet("df.parquet")   # lightweight

17.5 JSON, XML, web

jsonlite::fromJSON("data.json")                    # → data frame / list
jsonlite::toJSON(df, pretty = TRUE)
jsonlite::write_json(df, "out.json")
xml2::read_xml("data.xml") |> xml2::xml_find_all("//item")
read_csv("https://example.com/data.csv")           # read directly from a URL
download.file(url, "local.zip"); unzip("local.zip")

17.6 Databases (see §38)

con <- DBI::dbConnect(RSQLite::SQLite(), "db.sqlite")
DBI::dbWriteTable(con, "mtcars", mtcars); DBI::dbGetQuery(con, "SELECT * FROM mtcars LIMIT 5")

17.7 File system

file.exists("x.csv"); list.files("data", pattern = "\\.csv$", full.names = TRUE)
dir.create("output", showWarnings = FALSE); file.remove("tmp.txt"); file.copy("a", "b")
basename(path); dirname(path); tools::file_ext(path); file.path("data", "raw", "x.csv")
tempfile(fileext = ".csv"); normalizePath("."); file.info("x.csv")$size
fs::dir_ls("data", glob = "*.csv")            # fs package: tidy file system API
# Read many files into one data frame
files <- fs::dir_ls("data", glob = "*.csv"); all <- readr::read_csv(files, id = "source")