Rで、SQLのgroup by句のように、データフレームを分割したい。
単一の変数でデータフレームを分割するだけなら、split関数でも出来る。
#mtcarsをcyl変数で分割する
dfs <- split(mtcars, mtcars$cyl)
しかし複数の変数で分割したい場合、split関数は使えない。
こういうときは、dplyrのgroup_by関数を使うとよい。
group_by関数が返すオブジェクトにはindices属性がついており、これを使えばデータフレームを分割することができる。(ただしgroup_by関数の結果をそのままsummarise関数とかに流すだけならindices属性で分割する必要はないけど)
require(dplyr)
#mtcarsをcyl変数とgear変数で分割する
grouped_df <- mtcars %>%
group_by(cyl, gear)
indices <- attr(grouped_df, "indices")
#indicesに入っているインデックスの数値は0オリジンなので、1オリジンになおす
indices <- lapply(indices, function(index) index+1)
dfs <- lapply(indices, function(index) mtcars[index,])
追記
stackoverflowを見ていたらどうやらもっと簡単な方法があるらしく、split関数に変数のlistを渡すだけで複数の変数で分割できるようだ。ただし結果に長さが0行のデータフレームが含まれてしまうので、それを取り除く必要がある。
dfs <- split(mtcars,list(mtcars$cyl,mtcars$gear))
#0行のデータフレームを取り除く
dfs <- Filter(function(df) nrow(df) > 0, dfs)
参考