R using mutate() in for loop

Viewed 215

I want to use mutate() in a for loop, attaching columns with column names like:

y_1 y_2 y_3

Here are my codes:

table1 <- tibble(
  x = rep(1:3, each = 1)
)
table1
# A tibble: 3 x 1
x
<int>
1     1
2     2
3     3

table2 <- tibble(
  a1 = c(10, 20),
  a2 = c(30, 60)
)
table2

# A tibble: 2 x 2
    a1     a2
   <dbl>  <dbl>
1   10     30
2   20     40 

compute_y <- function(table1, table2){
  table2[1] + table2[2] * table1$x
}

for (i in 1:nrow(table2)){
  output = compute_y(table1, as.numeric(table2[i,]))
  label = str_c("y_", i)
  table1 <- mutate(table1, label = output)
}

table1
# A tibble: 3 x 2
      x  label
   <int> <dbl>
1     1    80
2     2   140 
3     3   200 

What do I need to do to get:

table1
# A tibble: 3 x 2
      x   y_1   y_2
   <int> <dbl> <dbl>
1     1   40     80
2     2   70    140 
3     3  100    200 
2 Answers

To assign a variable as column name you have to use non-standard evaluation. So to use value of label as name use !! and followed by :=

library(dplyr)
library(rlang)

for (i in 1:nrow(table2)){
  output = compute_y(table1, as.numeric(table2[i,]))
  label = str_c("y_", i)
  table1 <- mutate(table1, !!label := output)
}

table1
# A tibble: 3 x 3
#      x   y_1   y_2
#  <int> <dbl> <dbl>
#1     1    40    80
#2     2    70   140
#3     3   100   200

We can use base R to do this

for(i in seq_len(nrow(table2))) {
      output <- compute_y(table1, as.numeric(table2[i,]))
      label <- paste0("y_", i)
       table1[[label]] <- output
    }
table1  
# A tibble: 3 x 3
#      x   y_1   y_2
#  <int> <dbl> <dbl>
#1     1    40    80
#2     2    70   140
#3     3   100   200
Related