web-dev-qa-db-ja.com

dplyr:group_byの結果にdo()を適用する方法は?

Dplyrを使用してテーブルを1つの列でグループ化し、各グループの2番目の列の値のセットに関数を適用したいと思います。

たとえば、以下のコード例では、各人が食べた2項目の食品の組み合わせをすべて返したいと思います。 do()関数の適切な列(foods)を関数に適切に指定する方法がわかりません。

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)
20
zimmeee

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)dplyrの将来のバージョンを待たずに、@ Hadleyがコメントで説明していることに近いことを実行できるようにするには、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)

15
G. Grothendieck