2014-03-04 46 views
17

我想使用dplyr將一個表按一列分組,然後將函數應用於每個組的第二列中的一組值。dplyr:如何將do()應用於group_by的結果?

例如,在下面的代碼示例中,我想返回每個人所吃的食物的2項組合。我無法弄清楚如何在do()功能中正確提供功能和正確的色譜柱(食品)。

library(dplyr) 

person = c('Grace', 'Grace', 'Grace', 'Rob', 'Rob', 'Rob') 
foods = c('apple', 'banana', 'cucumber', 'spaghetti', 'cucumber', 'banana') 
eaten = data.frame(person, foods) 

by_person = group_by(eaten, person) 

# How to do this? 
do(by_person, combn(x = foods, m = 2)) 

注意,在?do示例代碼在我的機器上失敗

mods <- do(carriers, failwith(NULL, lm), formula = ArrDelay ~ date) 

回答

14

讓我們定義eaten這樣的:

eaten <- data.frame(person, foods, stringsAsFactors = FALSE) 

1)那就試試這個:

eaten %.% group_by(person) %.% do(function(x) combn(x$foods, m = 2)) 

捐贈:

[[1]] 
    [,1]  [,2]  [,3]  
[1,] "apple" "apple" "banana" 
[2,] "banana" "cucumber" "cucumber" 

[[2]] 
    [,1]  [,2]  [,3]  
[1,] "spaghetti" "spaghetti" "cucumber" 
[2,] "cucumber" "banana" "banana" 

2)爲了能夠做到接近到什麼@Hadley描述意見的東西,而無需等待未來版本的dplyr試試這個地方do2發現here

library(gsubfn) 
eaten %.% group_by(person) %.% fn$do2(~ combn(.$foods, m = 2)) 

捐贈:

$Grace 
    [,1]  [,2]  [,3]  
[1,] "apple" "apple" "banana" 
[2,] "banana" "cucumber" "cucumber" 

$Rob 
    [,1]  [,2]  [,3]  
[1,] "spaghetti" "spaghetti" "cucumber" 
[2,] "cucumber" "banana" "banana" 

注意:在幫助文件中給出代碼的問題的最後一行也失敗了。它的這種變化適用於我:do(jan, lm, formula = ArrDelay ~ date)

+6

在未來的dplyr版本中,您可以做更多的事情,比如'do(combn(。$ foods,m = 2))',組件會自動使用有用的名稱。 – hadley

+0

非常感謝您提供有用的解決方案!第一行中字符串AsAsactor的小錯字。 – zimmeee

+0

這次推出了新的:) – zimmeee