2014-10-06 56 views
2

dplyr::do(),有沒有辦法像其他dplyr函數一樣訪問.data上下文中的變量?例如,假設我有一個數據幀:dplyr do()沒有點代詞?

> 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,但不知道爲什麼我的 情況是不同的。

回答

3
  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 

但它取決於你想引用原始數據幀的頻率。您可能會發現使用管道專用功能更容易且更易讀。

  1. 您需要調用匿名函數,否則它只是返回函數定義。

像這樣:

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