如何在 dplyr 中使用表达式列表进行变异?
How to use expression list for mutate in dplyr?
我发现通常在 dplyr
中工作的数据屏蔽在与 !!
运算符一起使用时停止工作。
考虑一个简单的例子。
trans <- list(
a = rlang::expr(val),
b = rlang::expr(val*2)
)
df <- data.frame(name = c("a", "b"), val = 2:3)
然后,我想使用我的列表 trans
根据 name
中的值修改 val
列。然后,下面的代码将不起作用。
library(dplyr)
df %>%
rowwise() %>%
mutate(val = !!trans[[ name ]])
似乎找不到 name
。如果使用普通变量代替数据框中的 name
列,上面的代码将起作用。
我应该如何修改代码以使其按预期工作?谢谢。
您可以使用 eval
:
library(dplyr)
df %>%
rowwise() %>%
mutate(val_res = eval(trans[[name]]))
# name val val_res
# <chr> <int> <dbl>
#1 a 2 2
#2 b 3 6
我发现通常在 dplyr
中工作的数据屏蔽在与 !!
运算符一起使用时停止工作。
考虑一个简单的例子。
trans <- list(
a = rlang::expr(val),
b = rlang::expr(val*2)
)
df <- data.frame(name = c("a", "b"), val = 2:3)
然后,我想使用我的列表 trans
根据 name
中的值修改 val
列。然后,下面的代码将不起作用。
library(dplyr)
df %>%
rowwise() %>%
mutate(val = !!trans[[ name ]])
似乎找不到 name
。如果使用普通变量代替数据框中的 name
列,上面的代码将起作用。
我应该如何修改代码以使其按预期工作?谢谢。
您可以使用 eval
:
library(dplyr)
df %>%
rowwise() %>%
mutate(val_res = eval(trans[[name]]))
# name val val_res
# <chr> <int> <dbl>
#1 a 2 2
#2 b 3 6