How to Replicate Rows in a Data Frame in R

code
rtip
operations
Author

Steven P. Sanderson II, MPH

Published

March 19, 2024

Introduction

Are you working with a dataset where you need to duplicate certain rows multiple times? Perhaps you want to create synthetic data by replicating existing observations, or you need to handle imbalanced data by oversampling minority classes. Whatever the reason, replicating rows in a data frame is a handy skill to have in your R programming toolkit.

In this post, we’ll explore how to replicate rows in a data frame using base R functions. We’ll cover replicating each row the same number of times, as well as replicating rows a different number of times based on a specified pattern.

Let’s start by creating a sample data frame:

# Create a sample data frame
df <- data.frame(
  Name = c("Alice", "Bob", "Charlie", "David"),
  Age = c(25, 30, 35, 40),
  City = c("New York", "London", "Paris", "Tokyo")
)

df
     Name Age     City
1   Alice  25 New York
2     Bob  30   London
3 Charlie  35    Paris
4   David  40    Tokyo

Replicating Each Row the Same Number of Times

To replicate each row in a data frame the same number of times, we can use the rep() function in combination with row.names() and cbind(). Here’s an example where we replicate each row twice:

# Replicate each row twice
replicated_df <- cbind(df, rep(row.names(df), each = 2))

Output:

replicated_df
     Name Age     City rep(row.names(df), each = 2)
1   Alice  25 New York                            1
2     Bob  30   London                            1
3 Charlie  35    Paris                            2
4   David  40    Tokyo                            2
5   Alice  25 New York                            3
6     Bob  30   London                            3
7 Charlie  35    Paris                            4
8   David  40    Tokyo                            4

In this example, we use the rep() function to repeat the row names of the original data frame df twice for each row (using the each argument). We then combine the original data frame with the repeated row names using cbind() to create a new data frame replicated_df.

Replicating Rows a Different Number of Times

What if you want to replicate each row a different number of times? You can achieve this by creating a vector that specifies the number of times to replicate each row. Let’s say we want to replicate the first row twice, the second row three times, the third row once, and the fourth row four times:

# Vector specifying the number of times to replicate each row
replication_times <- c(2, 3, 1, 4)

# Replicate rows according to the specified pattern
replicated_df <- df[rep(row.names(df), times = replication_times), ]

Output:

replicated_df
       Name Age     City
1     Alice  25 New York
1.1   Alice  25 New York
2       Bob  30   London
2.1     Bob  30   London
2.2     Bob  30   London
3   Charlie  35    Paris
4     David  40    Tokyo
4.1   David  40    Tokyo
4.2   David  40    Tokyo
4.3   David  40    Tokyo

In this example, we create a vector replication_times that specifies the number of times to replicate each row. We then use the rep() function with the times argument to repeat the row names according to the specified pattern. Finally, we subset the original data frame df using the repeated row names to create the new data frame replicated_df.

Try It Yourself!

Replicating rows in a data frame is a useful skill to have, and the best way to solidify your understanding is to practice. Why not try replicating rows in your own datasets or create a new data frame and experiment with different replication patterns?

Remember, the syntax for replicating rows is:

# Replicate each row the same number of times
replicated_df <- cbind(df, rep(row.names(df), each = n))

# Replicate rows a different number of times
replication_times <- c(n1, n2, n3, ...)
replicated_df <- df[rep(row.names(df), times = replication_times), ]

Replace n with the number of times you want to replicate each row, and replace n1, n2, n3, etc., with the desired number of times to replicate each row individually.

Happy coding!