Creating Data Tables/Tibbles/Matrices with Multiple Loops in R: An Alternative Approach using Purrr, Base R, and rbinom

R Multiple Loops using Purrr: Creating a Data Table/Tibble/Matrix

In this article, we will explore how to use the purrr package in R for creating data tables/tibbles/matrices with multiple loops. We’ll start by examining the original code and then delve into alternative approaches using purrr.

Original Code

The original code uses a nested loop to simulate an experiment where red and white balls are drawn from a jar in 5 draws. The experiment is repeated for 10 iterations.

rc <- 1 # the number of red balls
wc <- 1 # the number of white balls
red <- rep("Red", rc)
white <- rep("White", wc)
jar <- c(red, white)
nb <- 5 # number of draws
N = 10 # Number of experiments
new_data <- matrix(NA, nrow = N, ncol = nb + 1)
count_red_new <- matrix(NA, nrow = N, ncol = nb)
red_count <- rep(NA, N)

#### nested loop
for (i in 1:N) {
  for (j in 1:nb) {
    new_data[i, j] <- sample(jar, 1, replace = T)
    if (new_data[i, j] == "Red") {
      count_red_new[i, j] = 1
    } else {
      count_red_new[i, j] = 0
    }
    red_count[i] = sum(count_red_new[i, ])
    new_data[i, nb + 1] = red_count[i]
  }
}
colnames(new_data) <- c("Draw1", "Draw2", "Draw3", "Draw4", "Draw5", "Red Ball Count")
new_data <- data.frame(new_data)

Alternative Approach using Purrr

The purrr package provides a more elegant way to perform multiple loops. In this approach, we use the map function to create a new dataframe with the desired columns.

library(tidyverse)

nb <- 1:5 # number of draws
n <- 10 # Number of experiments

# Create a dataframe with the desired structure
df <- nb %>% 
  set_names(paste0("draw", .)) %>% 
  map_df(~ rbinom(n, 1, prob = .5)) %>% 
  rowwise() %% 
  mutate(red_ball_count = sum(c_across(everything())))

# A tibble: 10 x 6
# Rowwise: 
   draw1 draw2 draw3 draw4 draw5 red_ball_count
   <int> <int> <int> <int> <int>          <int>
1     1     1     1     0     0              3
2     0     1     0     0     1              2
3     0     0     0     1     1              2
4     0     0     0     1     1              2
5     1     0     0     0     0              1
6     1     0     1     0     1              3
7     1     0     1     1     1              4
8     0     0     1     0     1              2
9     1     1     0     1     0              3
10    0     1     0     1     1              3

Base R Approach

For those who prefer not to use purrr, we can create the dataframe using base R.

df <- data.frame(t(replicate(n, rbinom(nb, 1, prob = .5))))
colnames(df) <- gsub("X", "Draw", colnames(df))
df['red_ball_count'] <- rowSums(df)

Using rbinom Directly

Finally, we can use the rbinom function directly to create a vector of red ball counts without using loops.

rbinom(n, nb, prob = .5)

In this article, we have explored alternative ways to perform multiple loops in R using the purrr package. We’ve seen how to use the map function to create a new dataframe with the desired columns and how to use base R functions to achieve similar results.


Last modified on 2023-05-24