LoginSignup
11
10

More than 5 years have passed since last update.

複数の変数でRのデータフレームを分割する

Last updated at Posted at 2016-03-08

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)

参考

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10