如何在 R 中使用 dplyr::mutate 中的表达式

Koo*_*opa 5 evaluation expression r dplyr non-standard-evaluation

我想根据给定的字符向量添加一个新列。例如,在下面的示例中,我想添加d在中定义的列expr

library(magrittr)

data <- tibble::tibble(
  a = c(1, 2),
  b = c(3, 4)
)

expr <- "d = a + b"
Run Code Online (Sandbox Code Playgroud)

如下:

data %>%
  dplyr::mutate(d = a + b)

# # A tibble: 2 x 3
#       a     b     d
#   <dbl> <dbl> <dbl>
# 1     1     3     4
# 2     2     4     6
Run Code Online (Sandbox Code Playgroud)

然而,在下面的代码中,虽然计算本身(即添加)有效,但新列的名称与我的预期不同。

data %>%
  dplyr::mutate(!!rlang::parse_expr(expr))

# # A tibble: 2 x 3
#       a     b `d = a + b`
#   <dbl> <dbl>       <dbl>
# 1     1     3           4
# 2     2     4           6

data %>%
  dplyr::mutate(!!rlang::parse_quo(expr, env = rlang::global_env()))

# # A tibble: 2 x 3
#       a     b `d = a + b`
#   <dbl> <dbl>       <dbl>
# 1     1     3           4
# 2     2     4           6

data %>%
  dplyr::mutate(rlang::eval_tidy(rlang::parse_expr(expr)))

# # A tibble: 2 x 3
#       a     b `rlang::eval_tidy(rlang::parse_expr(expr))`
#   <dbl> <dbl>                                       <dbl>
# 1     1     3                                           4
# 2     2     4                                           6
Run Code Online (Sandbox Code Playgroud)

如何正确使用 dplyr::mutate 中的表达式?

我的问题与此类似,但在我的示例中,新变量 ( d) 及其定义 ( a + b) 在单个字符向量 () 中给出expr

G. *_*eck 1

这些都有效。第二个与第一个类似,但不要求rlang位于搜索路径上。d=如果该部分不存在,则第三个和第四个也可以使用,expr在这种情况下使用默认名称。最后一种仅使用基数 R,也是最短的。

data %>% mutate(within(., !!parse_expr(expr)))

data %>% mutate(within(., !!parse(text = expr)))

data %>% mutate(data, !!parse_expr(sprintf("tibble(%s)", expr)))

data %>% { eval_tidy(parse_expr(sprintf("mutate(., %s)", expr))) }

within(data, eval(parse(text = expr)))  # base R
Run Code Online (Sandbox Code Playgroud)

笔记

假设这个前提:

library(dplyr)
library(rlang)

# input
data <- tibble(a = c(1, 2), b = c(3, 4))
expr <- "d = a + b"
Run Code Online (Sandbox Code Playgroud)