dplyr do()没有点代词?

时间:2014-10-06 08:48:57

标签: r dplyr

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

问题:

  1. 这种行为(范围)与之不同的逻辑是什么? mutateselect
  2. 是否有优雅的解决方案或我有 如果我不想继续使用,请继续使用with() 表达式中的.$variablename
  3. 为什么不是匿名者 功能工作?似乎它有效here但不确定为什么我的 情况不同。

1 个答案:

答案 0 :(得分:3)

  1. mutateselect等是专门设计用于使数据参数首先与magrittr的管道一起工作并帮助进行非标准评估的函数。 do是一个更通用的功能,无法做出相同的假设。

  2. 这取决于你想要做什么。如果您使用具有非标准评估的功能,则只需提供。一次。

  3. 例如:

    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的频率。对于此任务,您可能会发现使用管道专用功能更容易,更易读。

    1. 您需要调用匿名函数,否则它只是返回函数定义。
    2. 像这样:

      do(dd,{function(X) data.frame(a2=X$a[1:2]*2)}(.))
        a2
      1  2
      2  4