通过整洁的评估进行变异

时间:2018-02-07 20:57:04

标签: r tidyverse tidyeval

使用mutate_()我曾经提供了一个新变量列表和创建它们所需的逻辑。

library(dplyr)
library(rlang)

list_new_var <-
  list(new_1 = "am * mpg",
       new_2 = "cyl + disp")

mtcars %>% 
  mutate_(.dots = list_new_var) %>% 
  head()

现在我想过渡到使用整洁的评估。我正在理解新方法。

我该如何使这项工作?通常建议使用函数来解决这种情况吗?

f_mutate <- function(data, new) {

  a <- expr(new)
  b <- eval(new)
  c <- syms(new)
  d <- UQ(syms(new))
  e <- UQS(syms(new))
  f <- UQE(syms(new))

  data %>%
    mutate(f) %>%
    head()

}

f_mutate(mtcars, new = list_new_var)

2 个答案:

答案 0 :(得分:3)

一种选择是创建一个list quote作为参数返回而不进行评估

list_new_var <-list(
   new_1 = quote(am * mpg),
   new_2 = quote(cyl + disp)
)

并在f_mutate内,使用!!!进行评估

f_mutate <- function(data, new) {

 data %>%
     mutate(!!! new) 
 }

运行功能

f_mutate(mtcars, new = list_new_var) %>%
      head
#    mpg cyl disp  hp drat    wt  qsec vs am gear carb new_1 new_2
#1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  21.0   166
#2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  21.0   166
#3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  22.8   112
#4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   0.0   264
#5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   0.0   368
#6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   0.0   231

答案 1 :(得分:0)

我认为你不需要这个功能。我想你只需要以下

library(dplyr)

  mtcars %>% 
  as_tibble() %>% 
  mutate(new_column1 = am * mpg,
         new_column2 = cyl + disp) %>% 
  head()

查看第一个示例here