【问题标题】:dplyr do() without dot pronoun?dplyr do() 没有点代词?
【发布时间】:2014-10-06 08:48:57
【问题描述】:

dplyr::do() 中,有没有办法像其他dplyr 函数一样访问.data 上下文中的变量?例如,假设我有一个数据框:

> 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 但不知道为什么我的 情况不同。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    1. mutateselect 等是专门设计的函数,它们首先具有数据参数,它与 magrittr 的管道一起使用并帮助进行非标准评估。 do 是一个更通用的函数,不能做出相同的假设。

    2. 这取决于您要执行的操作。如果您使用具有非标准评估的函数,则只需提供 .一次。

    例如:

    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. 您需要调用匿名函数,否则它只是返回函数定义。

    像这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2016-07-15
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多