How To Merge Two Datasets In R

4 min read

How to Merge Two Datasets in R: A practical guide for Data Analysts

Merging datasets is a fundamental skill in data analysis, allowing you to combine information from different sources into a single, cohesive dataset. In R, there are several powerful functions for merging data, each serving different purposes depending on your data structure and analytical goals. This guide will walk you through the most common methods, complete with practical examples and best practices.

Understanding Merge Operations in R

Before diving into specific functions, it's essential to understand the different types of merge operations available:

  • Inner Join: Returns only matching rows from both datasets
  • Left Join: Returns all rows from the left dataset, plus matching rows from the right
  • Right Join: Returns all rows from the right dataset, plus matching rows from the left
  • Full Join: Returns all rows from both datasets, with matches where available
  • Anti Join: Returns rows from the left dataset that don't have matches in the right

Method 1: Using the Base R merge() Function

The merge() function is R's built-in solution for combining datasets. Its syntax is straightforward:

merge(x, y, by = "key_column", all = FALSE)

Where:

  • x and y are the datasets to merge
  • by specifies the column(s) to join on
  • all controls the type of join (FALSE for inner, TRUE for full, all.x = TRUE for left, all.y = TRUE for right)

Example: Inner Join

# Create sample datasets
customers <- data.frame(
  customer_id = c(1, 2, 3, 4),
  name = c("Alice", "Bob", "Charlie", "Diana"),
  city = c("New York", "London", "Tokyo", "Paris")
)

orders <- data.frame(
  order_id = c(101, 102, 103),
  customer_id = c(2, 1, 3),
  amount = c(150, 200, 75)
)

# Perform inner join
merged_inner <- merge(customers, orders, by = "customer_id")
print(merged_inner)

Output:

  customer_id    name  city order_id amount
1           1  Alice New York     102    200
2           2    Bob   London     101    150
3           3 Charlie   Tokyo     103     75

Example: Left Join

# Left join - keep all customers, even those without orders
merged_left <- merge(customers, orders, by = "customer_id", all.x = TRUE)
print(merged_left)

Output:

  customer_id    name  city order_id amount
1           1  Alice New York     102    200
2           2    Bob   London     101    150
3           3 Charlie   Tokyo     103     75
4           4   Diana  Paris      NA     NA

Method 2: Using dplyr Package Functions

The dplyr package offers more intuitive syntax for data manipulation. First, install and load it:

install.packages("dplyr")
library(dplyr)

Inner Join with dplyr

# Using inner_join()
merged_dplyr_inner <- customers %>%
  inner_join(orders, by = "customer_id")

Left Join with dplyr

# Using left_join()
merged_dplyr_left <- customers %>%
  left_join(orders, by = "customer_id")

Right Join with dplyr

# Using right_join()
merged_dplyr_right <- customers %>%
  right_join(orders, by = "customer_id")

Full Join with dplyr

# Using full_join()
merged_dplyr_full <- customers %>%
  full_join(orders, by = "customer_id")

Anti Join with dplyr

# Find customers without orders
customers_without_orders <- customers %>%
  anti_join(orders, by = "customer_id")

Merging by Multiple Columns

Sometimes you need to merge on more than one key column. Both merge() and dplyr functions handle this smoothly.

# Create datasets with composite keys
sales1 <- data.frame(
  region = c("North", "South", "East"),
  year = c(2020, 2021, 2022),
  revenue = c(1000, 1500, 1200)
)

sales2 <- data.frame(
  region = c("North", "South", "West"),
  year = c(2020, 2021, 2023),
  profit = c(200, 300, 250)
)

# Merge by multiple columns
merged_multi <- merge(sales1, sales2, by = c("region", "year"))

With dplyr:

merged_multi_dplyr <- sales1 %>%
  inner_join(sales2, by = c("region", "year"))

Handling Column Name Conflicts

When both datasets have columns with the same name (other than the key columns), you need to specify how to handle them.

# Create datasets with conflicting column names
data1 <- data.frame(
  id = c(1, 2, 3),
  value = c(10, 20, 30),
  category = c("A", "B", "C")
)

data2 <- data.frame(
  id = c(1, 2, 4),
  value = c(100, 200, 400),
  status = c("Active", "Inactive", "Active")
)

# merge() automatically adds suffixes
merged_suffix <- merge(data1, data2, by = "id")
# Result: value.x and value.y

# In dplyr, use suffix parameter
merged_dplyr_suffix <- data1 %>%
  inner_join(data2, by = "id", suffix = c("_left", "_right"))

Advanced Merging Techniques

Merging with Different Column Names

If the key columns have different names in each dataset, you can specify this:

# Datasets with different key names
customers_alt <- customers
colnames(customers_alt)[1] <- "client_id"  # Rename customer_id to client_id

# Using merge()
merged_diff_names <- merge

merged_diff_names <- merge(customers, orders, by.x = "customer_id", by.y = "id")

To achieve the same result using `dplyr`, you can explicitly map the differing key names in the `by` argument:

```r
merged_diff_names_dplyr <- customers %>%
  inner_join(orders, by = c("customer_id" = "order_id"))

This capability is especially useful when working with legacy databases or datasets where schema inconsistencies are common. By understanding how to specify differing keys, you can easily combine your data regardless of naming conventions or structural differences.

Choosing the Right Join Strategy

When merging datasets, the choice of join type dictates which rows are retained and how unmatched records are handled. An inner_join keeps only records present in both datasets, making it ideal for focusing

What's Just Landed

This Week's Picks

Connecting Reads

Worth a Look

Thank you for reading about How To Merge Two Datasets In R. We hope the information has been useful. Feel free to contact us if you have any questions. See you next time — don't forget to bookmark!
⌂ Back to Home