層別サンプリングした結果を綺麗に持ちたい

層別サンプリングをするには、samplingパッケージのstrata関数使えばいいんだけど、出力とインターフェイスがイケてないのでラップする。


下記の`stratified_sampling`関数を使えば、各層(クラス)の割合を一定に保ったままサンプリングしてくれる。

library("sampling")
stratified_sampling <- function(df, name, size)
{
  sizes <- df %>% 
    count_(name) %>% 
    mutate(size_sampling=round(n/nrow(df)*size)) %>% 
    select(size_sampling) %>% unlist %>% as.numeric
  getdata(df, strata(df, name, size=sizes, method="srswor"))[, colnames(df)]
}

実行結果

> stratified_sampling(iris, "Species", 9)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
5            5.0         3.6          1.4         0.2     setosa
14           4.3         3.0          1.1         0.1     setosa
25           4.8         3.4          1.9         0.2     setosa
65           5.6         2.9          3.6         1.3 versicolor
82           5.5         2.4          3.7         1.0 versicolor
93           5.8         2.6          4.0         1.2 versicolor
102          5.8         2.7          5.1         1.9  virginica
109          6.7         2.5          5.8         1.8  virginica
147          6.3         2.5          5.0         1.9  virginica

これでCross Validationするのに使うには、どのデータがどこから来たのか覚えるようにしないとだめだなぁ。。。