🍭データフレームからランダムにデータを抽出したい
北のマエショリストこと(面識もない私が勝手に呼んでいる) id:WAFkw さんがこんな記事を書いていた。
手持ちのテーブルから、無作為(ランダム)にサンプルを抽出する(リサンプリング)、という記事。そしてそのレスポンスとして、{dplyr}
でこれできるよ、という話(マエショリストさんのやりたいことと違っていたらどうしよう)。自分自身もちょっと前に得た知見なので共有のために書いておく。
data <- data.frame(ID = seq(1, 9999)) head(data)
## ID
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5
## 6 6
tail(data)
## ID
## 9994 9994
## 9995 9995
## 9996 9996
## 9997 9997
## 9998 9998
## 9999 9999
こうしたテーブルから、テーブルの一部を新しいテーブルとして解析を進めたい場合には、偏りをなくすために既存のテーブルからランダムにデータをとりなおす必要がある。
というわけで、みんな大好きHadleyの {dplyr}
を使う。テーブルからデータをとってくる関数はsample_n
とsample_frac
がある。これらの関数はヘルプに書いてある通り、base::sample
関数のラッパーとなっており、現在はローカル環境のテーブルにのみ適用される(データベースからとってきたテーブルには無理)。
library(dplyr)
sample_n(tbl = data, size = 10)
## ID
## 340 340
## 8088 8088
## 3263 3263
## 9419 9419
## 5191 5191
## 7530 7530
## 7453 7453
## 142 142
## 7759 7759
## 6032 6032
sample_frac(tbl = data, size = 0.001)
## ID
## 2198 2198
## 5483 5483
## 5171 5171
## 6566 6566
## 9163 9163
## 8641 8641
## 4705 4705
## 7742 7742
## 8291 8291
## 5454 5454
sample_n
とsample_frac
の違いは、抽出するデータ数の指定方法である。sample_n
では、テーブル内から取得したいデータ数を直接size引数に渡す。一方sample_frac
では同じsize引数に渡す値は、全体のデータに対する割合を指定する。今回の場合、data数が9999件であったので、そのうちの0.001割(10件分)のデータを抽出した。
この関数にはreplaceやweightといった引数が用意されており、サンプルの方法にもこだわれるみたいだが、勉強不足なのでここでは説明できない。誰か教えて欲しい。
追記
素敵なお兄さんが教えてくれました (2015-10-12)
@u_ribo replaceは、重複を許すかどうか。シミュレーションするときとか、元のデータ数より多いサンプルデータを生成したいときとかに使う、みたいな感じだと思う(あんまり実用的な場面で使ったことなくてよく知らない…)
— Hiroaki Yutani (@yutannihilation) October 12, 2015
メモ
- Rでデータサンプリングを行う - shakezoの日記 (2015-10-13)
- Rの data.table と data.frame を dplyr で区別なく扱う - StatsFragments (2015-10-13) id:sinhrks (うさぎさん)の 記事でも取り上げられていた。SEとNSEの違いも理解できて良い