20

我想使用 dplyr 按一列对表进行分组,然后将函数应用于每组第二列中的一组值。

例如,在下面的代码示例中,我想返回每个人吃的所有 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)
4

1 回答 1

15

让我们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找到:

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).

于 2014-03-04T20:59:08.150 回答