2017-09-09 3 views
0

は私が元のデータ配信の割合を維持しながらランダムな行を選択していますか?

d[,.N,by=group] 

として配布されている5つのグループのためのデータを表し、次のdata.table

d <- data.table(group=rep(letters[1:5],c(30,20,20,20,10)), x=1:100, y=101:201) 

を持って考えてみましょう、私は小さなサンプルを選択しないか、のは10行としましょう(または1つまたは複数の列に基づいておおよそ類似したグループ分布を有するデータの10%)。だから、上記の表Iは、何かのようになります受け取ることができる架空のサブセットのため:

group x y 
    a  8 108 
    b  32 132 
    e  93 193 
    b  46 146 
    d  88 188 
    c  53 153 
    c  68 168 
    a  19 119 
    d  74 174 
    a  24 124 

私はこれを行うにはどうすればよい、好ましくは、data.table?あなたがこれについて議論するSO hereに関する質問がありますが、私はむしろ分配率を手動で計算しません。

答えて

5

私はcaretを使うべきだと思います。 createDataPartition()関数は、ターゲット変数の確率分布を失うことなくデータセットをサブセット化することを意味します。

library(caret) 
my.ids <- createDataPartition(d$group, p = 0.1) 
train <- d[as.numeric(my.ids[[1]]), ] 

母集団とサブセットのターゲット変数の分布を確認できます。

par(mfrow = c(1,2)) 
barplot(table(d$group), main = "full dataset") 
barplot(table(train$group), main = "subset") 

enter image description here

+0

非常に良い! Damianoさん、 'caret :: createDataPartition'と徹底的な答えを指摘してくれてありがとうございます。 – Vijay

2

あなたはグループによってインデックス/ ROW_NUMBER.Iをサンプリングし、それを用いて元のデータテーブルをサブセットすることができる:

d[d[, sample(.I, .N * 0.1), group]$V1] 

# group x y 
# 1:  a 10 110 
# 2:  a 2 102 
# 3:  a 14 114 
# 4:  b 45 145 
# 5:  b 49 149 
# 6:  c 62 162 
# 7:  c 51 151 
# 8:  d 84 184 
# 9:  d 76 176 
#10:  e 100 200 

ここ.I、すなわち、グローバル行番号を表す整数ベクトルであるseq_len(nrow(d))d[, sample(.I, .N * 0.1), group]各グループから行番号の割合を取って、元のdata.tableを索引でサブセット化します(デフォルトの列はV1)。

+1

か 'D [サンプル(.N)、ヘッド(.SD、.N * 0.1)=基によって]'(寄せ集めすべての行は、次に、上部選択)。 – Frank

+0

@Frankいいです。 – Psidom

+1

ありがとうPsidomとフランク!質問書式を修正してくれてありがとう@フランク。とても有難い。 – Vijay

関連する問題