在 dplyr 1.0 中重命名 tidyeval 中的列

Renaming column in tidyeval in dplyr 1.0

我希望在 tidy evaluation 中根据接收变量生成新列。例如,

library(dplyr)

some_custom_measure <- function(.data, cola, colb) {
    .data %>% mutate("{{ cola }}_x_{{ colb }}" := {{ cola }} * {{ colb }})
}
iris %>% 
    some_custom_measure(Sepal.Length, Sepal.Width) %>% 
    head()

新列将被命名为 Sepal.Length_x_Sepal.Width

在自定义函数中形成新名称时如何将变量作为字符串操作?我希望完成类似 sepal_length_x_sepal_width

的事情

您可以使用deparse(substitute(...))将每个变量名捕获为字符串并将其存储到变量中。

然后您可以按照自己喜欢的方式处理该变量来处理字符串。当你开始使用它时,将变量放在你的列名规范中的单个大括号内。

library(dplyr)

some_custom_measure <- function(.data, cola, colb) {

    cola_name <- tolower(gsub("\.", "_", deparse(substitute(cola))))
    colb_name <- tolower(gsub("\.", "_", deparse(substitute(colb))))

    .data %>% mutate("{cola_name}_x_{colb_name}" := {{ cola }} * {{ colb }})
}

iris %>% 
    some_custom_measure(Sepal.Length, Sepal.Width) %>% 
    head()
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa
#>   sepal_length_x_sepal_width
#> 1                      17.85
#> 2                      14.70
#> 3                      15.04
#> 4                      14.26
#> 5                      18.00
#> 6                      21.06