2017-07-26 36 views
0

使用[R 3.2.2dplyr 0.7.2我試圖找出如何有效地使用group_by作爲與特徵向量供應領域。GROUP_BY非標字符向量使用tidyeval

選擇是容易我可以像經由多個串通過長度> 1這樣一個字符向量此

(function(field) { 
    mpg %>% dplyr::select(field) 
})("cyl") 

多個字段這樣

(function(...) { 
    mpg %>% dplyr::select(!!!quos(...)) 
})("cyl", "hwy") 

和多個字段經由串選擇一個字段

(function(fields) { 
    mpg %>% dplyr::select(fields) 
})(c("cyl", "hwy")) 

With group_by我無法真正找到一種方法來處理多個字符串,因爲如果我設法得到一個輸出,它最終會由我提供的字符串進行分組。

我設法組由一個字符串這樣

(function(field) { 
    mpg %>% group_by(!!field := .data[[field]]) %>% tally() 
})("cyl") 

這已經是相當難看。

有誰知道我必須寫這樣我就可以運行

(function(field) {...})("cyl", "hwy") 

(function(field) {...})(c("cyl", "hwy")) 

分別?我嘗試了各種各樣的組合!!,!!!,UQ,enquo,quos,unlist等等,並將它們保存在中間變量中,因爲它有時似乎有所作爲,但卻無法讓它起作用。

回答

2

select()在dplyr中很特別。它不接受,但列名稱職位。這就是接受字符串的唯一主動詞。 (從技術上講,當你提供一個像cyl這樣的裸號名稱時,它實際上會被評估爲自己的名稱,而不是數據幀中的矢量。)

如果您希望函數採用簡單的字符串,表達式或符號,你不需要quards。只要創建從串符號和解除引用它們:

myselect <- function(...) { 
    syms <- syms(list(...)) 
    select(mtcars, !!! syms) 
} 
mygroup <- function(...) { 
    syms <- syms(list(...)) 
    group_by(mtcars, !!! syms) 
} 

myselect("cyl", "disp") 
mygroup("cyl", "disp") 

要調試unquoting,與expr()包裹,並檢查表達期待權:

syms <- syms(list("cyl", "disp")) 
expr(group_by(mtcars, !!! syms)) 
#> group_by(mtcars, cyl, disp) # yup, looks right! 

看到這個聊了更多關於這個(我們」將更新編程小插圖以使這些概念更清晰):https://schd.ws/hosted_files/user2017/43/tidyeval-user.pdf

最後請注意,許多動詞有接受字符串和特徵向量沒有大驚小怪一個_at後綴的變體:

group_by_at(mtcars, c("cyl", "disp")) 
+0

好極了,感謝這麼多的快速解答! –