【问题标题】:Mutate with tidy evaluation通过整洁的评估进行变异
【发布时间】:2018-07-18 06:59:37
【问题描述】:

我使用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)

【问题讨论】:

  • 为了将来参考,另一种方法是使用 parse_quosure()。我本可以完成 rlang_list % lapply(rlang::parse_quosure); mtcars %>% mutate(!!! rlang_list)

标签: r tidyverse tidyeval


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为您不需要为此提供功能。我认为您只需要以下内容

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

    查看第一个示例here

    【讨论】:

    • 问题是这些新变量将在各种用户界面中预先指定,所以我想传入变量创建逻辑,而不是实际创建变量。
    猜你喜欢
    • 2021-01-08
    • 2018-06-09
    • 2018-06-10
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多