在dplyr::do()
中,是否有办法在.data
的上下文中访问变量,与其他dplyr函数一样?例如,假设我有一个数据框:
> dd <- data.frame(a=1:5)
mutate()
以及其他函数的工作原理是在数据框的上下文中计算表达式:
> mutate(dd,a2=a*2)
a a2
1 1 2
2 2 4
3 3 6
4 4 8
5 5 10
但不是do
:
> do(dd,data.frame(a2=a[1:2]*2))
Error in eval(expr, envir, enclos) : object 'a' not found
我可以使用with()
和点代词来实现我的目标:
> do(dd,with(.,data.frame(a2=a[1:2]*2)))
a2
1 2
2 4
我也不确定为什么这不起作用:
> do(dd,function(X) data.frame(a2=X$a[1:2]*2))
Error: Result must be a data frame
问题:
mutate
,select
等with()
表达式中的.$variablename
?答案 0 :(得分:3)
mutate
,select
等是专门设计用于使数据参数首先与magrittr
的管道一起工作并帮助进行非标准评估的函数。 do
是一个更通用的功能,无法做出相同的假设。
这取决于你想要做什么。如果您使用具有非标准评估的功能,则只需提供。一次。
例如:
do(dd, transform(.,a2=a*2)[1:2,]["a2"])
a2
1 2
2 4
但它并不比with
好。高尔夫最好的代码是:
do(dd, data.frame(a2=.$a[1:2]*2))
a2
1 2
2 4
但这取决于您想要引用原始data.frame的频率。对于此任务,您可能会发现使用管道专用功能更容易,更易读。
像这样:
do(dd,{function(X) data.frame(a2=X$a[1:2]*2)}(.))
a2
1 2
2 4