R Advanced

How to Remove NA Values from Data Frame in R

NA values are missing values. They are somehow absent from a data frame. Before creating a model based on a data frame, we need to clean the data frame from missing values, and it depends on different scenarios.

Here are four different ways for different scenarios to remove NA values from a data frame:

  1. Use na.omit()
  2. Use complete.cases()
  3. Use is.na() with Subsetting
  4. Tidyverse approach

Here is the sample data frame that contains NA values:

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

Method 1: Using na.omit()

The main operation of the na.omit() function is to remove all the rows containing any NA values from a data frame.

df <- data.frame(
 name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
 score = c(85, 90, 78, 92, 92, NA),
 subject = c("Math", "Math", NA, "History", "Biology", "Science"),
 grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing rows with NA values
df_without_na <- na.omit(df)

print(df_without_na)

Output

The above output figure shows that rows 3, 5, and 6 have been removed because they all contain at least one NA value.

Method 2: Using complete.cases()

The complete.cases() function provides flexibility: You can either remove all the rows that contain NA values or remove rows with NA in specific columns.

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing rows with NA values
df_clean <- df[complete.cases(df), ]

print(df_clean)

Output

You can use the complete.cases() on selected columns like this:

Let’s remove NAs based on columns “name” and “grade”.

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing rows with NA values
df_clean_cols <- df[complete.cases(df[, c("name", "grade")]), ]

print(df_clean_cols)

Output

The “subject” column also has an NA value, but we did not specify that, so it is in the output.

Method 3: Use is.na() with Subsetting

Subsetting is a process where you apply specific conditions to a data frame and select the rows based on the outcome of those conditions. It is like selecting rows based on your filter.

You can subset rows where specific columns are not NA.

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing rows with NA values from column "name"
df_clean_name <- df[!is.na(df$name), ]

print(df_clean_name)

Output

Method 4: Using tidyverse (dplyr/tidyr)

The tidyr::drop_na() function is designed to drop rows containing missing values.

Install the tidyr package and then load it using the library() function.

library(tidyr)

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing all rows with NA values
df_clean <- df %>% drop_na()

print(df_clean)

Output

You can also remove rows with NA based on specific columns using the drop_na() function.

library(tidyr)

df <- data.frame(
  name = c("Krunal", "Ankit", "Rushabh", "Dhaval", "Niva", NA),
  score = c(85, 90, 78, 92, 92, NA),
  subject = c("Math", "Math", NA, "History", "Biology", "Science"),
  grade = c("10th", "12th", "11th", "10th", NA, NA)
)

print(df)

# Removing all rows with NA values
df_clean_cols <- df %>% drop_na(name, grade)

print(df_clean_cols)

Output

That’s all!

Recent Posts

How to Set and Get Working Directory [setwd() and getwd()] in R

Set the current working directory The setwd() function sets the working directory to the new…

3 days ago

Standard deviation in R [Using sd() Function]

The sd() function in R calculates the sample standard deviation of a numeric vector or…

4 days ago

R dnorm(): Probability Density Function

The dnorm() function in R calculates the value of the probability density function (pdf) of…

5 days ago

R rep() Function: Repeating Elements of a Vector

R rep() is a generic function that replicates elements of vectors and lists for a…

1 week ago

Splitting Strings: A Beginner’s Guide to strsplit() in R

The strsplit() function in R splits elements of a character vector into a list of…

1 week ago

Understanding of rnorm() Function in R

The rnorm() method in R generates random numbers from a normal (Gaussian) distribution, which is…

2 weeks ago