我一直在阅读,但是我无法理解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)中的错误:参数的“类型”(字符)无效
我真的想了解这里的基本原理...谢谢!
答案 0 :(得分:1)
book on Tidy Evaluation是学习NSE的绝佳资源。您可能会发现Chapter 8特别有用。
在这种情况下,您需要首先将字符串转换为符号变量名称:
s1 <- sym(var)
s2 <- sym(var2)
如果直接在dplyr中使用s1
和s2
,它将尝试在数据框中查找名为s1
和s2
的列。这不是您想要的。而是要访问存储在变量s1
和s2
中的内部中的符号。您可以通过取消引用运算符!!
来完成此操作:
df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )
## Or putting everything together
df %>% group_by( !!sym(var) ) %>% mutate( new=sum(!!sym(var2)) )