Подтвердить что ты не робот

Dplyr: Как применить do() к результату group_by?

Я хотел бы использовать 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)
4b9b3361

Ответ 1

Определим 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).