从 function 里面 across 访问新的列名

Access to the new column name from the function inside across

是否可以从 across 函数中获取新列的名称?

例如

data.frame(a=1) %>% 
mutate(across(c(b=a, c=a), function(i) if("new column name"=="b") a+1 else a+0.5))

预期结果:

#>   a b   c
#> 1 1 2 1.5

reprex package (v2.0.0)

于 2021-12-09 创建

我尝试使用 cur_column(),但在本例中它的 return 值似乎是 a

很抱歉,这个例子太简单了,无法通过其他方式实现预期的结果,但我的实际代码是一个很难提供的大型嵌套数据框。

有趣的问题。似乎因为您在 across 调用中定义了 bc,所以它们无法通过 cur_column().

获得
data.frame(a=1) %>%
  mutate(across(c(b=a, c=a), function(i) print(cur_column())))
#> [1] "a"
#> [1] "a"

如果它们已在 data.frame 中定义,则可以正常工作。在这里使用 tibble() 这样我就可以在构造函数中引用 a

tibble(a=1, b=a, c=a) %>%
  mutate(across(-a, ~ if (cur_column() == "b") .x + 1 else .x + 0.5))
#> # A tibble: 1 × 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1     1     2   1.5

即使您在同一个 mutate() 调用中也同样有效,只需确保在 across().[=30= 之前定义 bc ]

data.frame(a=1) %>%
  mutate(across(c(b=a, c=a), ~.x),
         across(-a, ~ if (cur_column() == "b") .x + 1 else .x + 0.5))
#>   a b   c
#> 1 1 2 1.5

我相信它正在发生,因为 acrossrhs (a) 上工作,并且只将值分配给 lhs (b)应用 across() 中的函数后。我不确定这是预期的行为(虽然它看起来确实是正确的),我实际上不知道,所以会打开一个 GitHub 问题,因为我认为这是一个有趣的例子!