问题描述
我想在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