Я хочу использовать mutate () в цикле for, присоединяя столбцы с именами столбцов, например:

Y_1 y_2 y_3

Вот мои коды:

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 

Что мне нужно сделать, чтобы получить:

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
Steve 29 Авг 2020 в 09:55

2 ответа

Лучший ответ

Мы можем использовать base R для этого

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
0
akrun 29 Авг 2020 в 19:19

Чтобы присвоить переменной имя столбца, вы должны использовать нестандартную оценку. Итак, чтобы использовать значение label в качестве имени, используйте !!, за которым следует :=

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
2
Ronak Shah 29 Авг 2020 в 07:05