Mutate_ 中的 NSE 与 SE

NSE vs SE in mutate_

我一直在阅读和阅读,但我无法理解 R 中的 NSE 与 SE。我希望有人能正确解释它。

df=data.frame(a=1:6,b=7:12,c=13:18,d=rep(c("a","b"),each=3))

这是我惯用的方法,而且有效:

df %>% group_by(d) %>% mutate(new=sum(a))

现在我进入了新的领域,这有效,但会发出警告。有人可以向我解释如果不使用 group_by_ 我该怎么做吗?

var="d"
df %>% group_by_(`var`) %>% mutate(new=sum(a))

Warning message: group_by_() is deprecated. Please use group_by() instead

现在,我真正想做的是,这只是抛出一个错误:

var="d"
var2="a"
df %>% group_by_(`var`) %>% mutate_(new=sum(`var2`))

Error in sum(var2) : invalid 'type' (character) of argument

我真的很想了解这里的基本原理...谢谢!

book on Tidy Evaluation is a fantastic resource to learn about NSE. You may find Chapter 8特别有用。

在您的情况下,您需要先将字符串转换为符号变量名:

s1 <- sym(var)
s2 <- sym(var2)

如果您直接在 dplyr 中使用 s1s2,它会尝试在您的数据框中查找名为 s1s2 的列。这不是你想要的。相反,您想要访问存储在 inside 变量 s1s2 中的符号。您可以通过取消引用运算符 !!:

df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )

## Or putting everything together
df %>% group_by( !!sym(var) ) %>% mutate( new=sum(!!sym(var2)) )