cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

🍭データフレームからランダムにデータを抽出したい

北のマエショリストこと(面識もない私が勝手に呼んでいるid:WAFkw さんがこんな記事を書いていた。

wafdata.hatenablog.com

手持ちのテーブルから、無作為(ランダム)にサンプルを抽出する(リサンプリング)、という記事。そしてそのレスポンスとして、{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_nsample_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_nsample_fracの違いは、抽出するデータ数の指定方法である。sample_nでは、テーブル内から取得したいデータ数を直接size引数に渡す。一方sample_fracでは同じsize引数に渡す値は、全体のデータに対する割合を指定する。今回の場合、data数が9999件であったので、そのうちの0.001割(10件分)のデータを抽出した。

この関数にはreplaceweightといった引数が用意されており、サンプルの方法にもこだわれるみたいだが、勉強不足なのでここでは説明できない。誰か教えて欲しい。

追記

素敵なお兄さんが教えてくれました (2015-10-12)

メモ