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 中使用 s1
和 s2
,它会尝试在您的数据框中查找名为 s1
和 s2
的列。这不是你想要的。相反,您想要访问存储在 inside 变量 s1
和 s2
中的符号。您可以通过取消引用运算符 !!
:
df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )
## Or putting everything together
df %>% group_by( !!sym(var) ) %>% mutate( new=sum(!!sym(var2)) )
我一直在阅读和阅读,但我无法理解 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 中使用 s1
和 s2
,它会尝试在您的数据框中查找名为 s1
和 s2
的列。这不是你想要的。相反,您想要访问存储在 inside 变量 s1
和 s2
中的符号。您可以通过取消引用运算符 !!
:
df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )
## Or putting everything together
df %>% group_by( !!sym(var) ) %>% mutate( new=sum(!!sym(var2)) )