How to use read.csv in R

base-r
read.csv
Learn how to perform use read.csv in R. Step-by-step statistical tutorial with examples.
Published

February 22, 2026

Introduction

The read.csv() function is R’s built-in tool for importing comma-separated values (CSV) files into your R environment as data frames. This function is essential for data analysis workflows since CSV files are one of the most common formats for storing and sharing tabular data.

Getting Started

library(tidyverse)

Example 1: Basic Usage

The Problem

You have a simple CSV file with basic data that you need to import into R. Let’s start by understanding how read.csv() works with its default settings.

Step 1: Create sample data

First, let’s create a sample CSV file to work with.

# Create sample data
sample_data <- data.frame(
  name = c("Alice", "Bob", "Charlie"),
  age = c(25, 30, 35),
  city = c("New York", "London", "Tokyo")
)
write.csv(sample_data, "sample_data.csv", row.names = FALSE)

This creates a simple CSV file with three columns and saves it to your working directory.

Step 2: Read the CSV file

Now we’ll import the CSV file using the basic read.csv() function.

# Read the CSV file
imported_data <- read.csv("sample_data.csv")
print(imported_data)
head(imported_data)

The data is successfully imported as a data frame with the same structure as our original data.

Step 3: Examine the data structure

Let’s verify the data types and structure of our imported data.

# Check data structure
str(imported_data)
class(imported_data)
colnames(imported_data)

You can see that read.csv() automatically detected column names and assigned appropriate data types to each column.

Example 2: Practical Application

The Problem

You’re working with a real dataset that has missing values, different separators, and requires specific data type handling. The mtcars dataset will be exported with some modifications to simulate common real-world CSV import challenges.

Step 1: Create a realistic CSV file

Let’s create a more complex CSV file that mimics real-world data issues.

# Prepare mtcars data with some modifications
modified_mtcars <- mtcars |>
  rownames_to_column("car_model") |>
  slice(1:10)
# Introduce some missing values
modified_mtcars$mpg[3] <- NA
write.csv(modified_mtcars, "cars_data.csv", row.names = FALSE)

This creates a more realistic dataset with row names as a column and some missing values.

Step 2: Import with custom parameters

Now we’ll import the data using specific parameters to handle potential issues.

# Read CSV with custom parameters
cars_data <- read.csv("cars_data.csv", 
                     header = TRUE,
                     na.strings = c("", "NA"),
                     stringsAsFactors = FALSE)
head(cars_data, 3)

We explicitly specified parameters to handle headers, missing values, and prevent automatic conversion to factors.

Step 3: Verify and clean the imported data

Let’s examine the imported data and perform basic validation.

# Check for missing values and data types
summary(cars_data)
sapply(cars_data, class)
sum(is.na(cars_data))

This shows us the data summary, column types, and count of missing values in our imported dataset.

Step 4: Handle different file paths

When working with files in different directories, you’ll need to specify the full path.

# Example of reading from different locations
# cars_data <- read.csv("data/cars_data.csv")  # subfolder
# cars_data <- read.csv("~/Desktop/cars_data.csv")  # home directory
# Clean up our example files
file.remove("sample_data.csv", "cars_data.csv")

Always use proper file paths and clean up temporary files when working with examples.

Summary

  • read.csv() is R’s built-in function for importing CSV files into data frames with automatic data type detection
  • The function includes useful parameters like header, na.strings, and stringsAsFactors for handling real-world data complexities
  • Always examine your imported data using str(), summary(), and head() to verify the import was successful
  • Specify full file paths when working with files in different directories, and use forward slashes or double backslashes in paths
  • Consider data cleaning and validation steps immediately after importing to ensure data quality for your analysis