2017-11-09 7 views
0

大きなデータセットがあり、サンプルしたい複数のグループがあります。各グループには一定の数の正のケースがあり、値は1であり、負のケースはさらに多く、値はゼロです。R - ラージデータセットを使用した層別サンプリング

各グループについて、すべての肯定的なケースを選択し、そのグループの肯定的なケースの量の4倍に等しい負のケースのランダムな量を選択したい。

また、大量のデータをすばやく実行できるものが必要です。

セミ更新:

stratified_sample = data %>% 
    group_by(group) %>% 
    mutate(n_pos = sum(response == 1), 
      n_neg = 4 * n_pos) %>% 
    group_by(group,response) %>% 
    mutate(rec_num = n(), 
     random_val = runif(n()), 
     random_order = rank(random_val)) %>% 
    filter(response == 1 | random_order <= n_neg) 
+0

あなたの質問に[最小再現可能な例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を含めると、回答が得られる可能性が高くなります。 – jsb

答えて

0

あなたが正しい名前でサブ場合、これは動作するはずです。問題がある場合は、再現可能な例を提供してください。

library(dplyr) 

stratified_sample = your_large_dataset %>% 
    group_by(whatever_your_grouping_variable_is) %>% 
    mutate(n_pos = sum(column_name_of_your_label == 1), 
      n_neg = sum(column_name_of_your_label == 0), 
      cutoff = 4 * n_pos/n_neg) %>% 
    filter(column_name_of_your_label == 1 | runif(n()) < cutoff) 

これはサンプル画分が正確ではありませんので、/負例数は、選択されるように、各負の場合に正例4 *数の確率を与えるが、それはあなたが望む期待値を持っています。

+0

あなたは私を本当に近づけましたが、カットオフをどのように行っているのかという性質によって、時には4倍の正のケースが得られますが、ランダムな値がどのように振れているかによって決まる場合があります。私は仕事をしなければならないコードで "Semi:update"を投稿しました。先に進んで答えを変えたり、あなたの回答クレジットを修正したりしてください。 –

関連する問題