【问题标题】:R using mutate() in for loopR 在 for 循环中使用 mutate()
【发布时间】:2020-08-29 06:55:22
【问题描述】:

我想在 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 

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我喜欢这两个版本(基本 R 和 rlang 包)。我是初学者,所以我将基础 R 版本标记为答案。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-11
      • 2016-10-15
      • 2023-03-06
      • 2017-06-08
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多