R在循环中使用mutate

问题描述

我想在for循环中使用mutate(),将列名称附加为以下列:

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 

解决方法

要将变量分配为列名,您必须使用非标准评估。因此,要将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
,

我们可以使用base R来完成

for(i in seq_len(nrow(table2))) {
      output <- compute_y(table1,]))
      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