NSE vs SE in mutate _

时间:2019-06-14 13:47:14

标签: r dplyr nse

我一直在阅读,但是我无法理解R中的NSE vs 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))
  

警告消息:不推荐使用group_by_()。请使用group_by()   代替

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

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

sum(var2)中的错误:参数的“类型”(字符)无效

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

1 个答案:

答案 0 :(得分:1)

book on Tidy Evaluation是学习NSE的绝佳资源。您可能会发现Chapter 8特别有用。

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

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

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

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

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