关于mutate_中的r:NSE vs SE

NSE vs SE in mutate_

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

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

这是我所习惯的,并且有效:

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

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

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

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

现在,在我真正想做的事情上,这只会引发错误:

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

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

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


有关整洁评估的书是学习NSE的绝佳资源。您可能会发现第8章特别有用。

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

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

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

来执行此操作

1
2
3
4
df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )

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