2015-11-21 6 views
5

次のサンプルデータフレームでは、「コホート」の各レベルからIDの「ID」の層別ランダムサンプル(例:40% :私は使用して行の乱数を描画する方法を知っているR:グループ化変数による一意のIDの層別ランダムサンプル割合

data<-structure(list(Cohort = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), ID = structure(1:20, .Label = c("a1 ", 
"a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "b10", "b11", 
"b12", "b13", "b14", "b15", "b16", "b17", "b18", "b19", "b20" 
), class = "factor")), .Names = c("Cohort", "ID"), class = "data.frame", row.names = c(NA, 
-20L)) 

library(dplyr) 
data %>% 
group_by(Cohort) %>% 
sample_n(size = 10) 

をしかし、私の実際のデータは縦ですので、私は、各コホートと、いくつかの内に同じIDの複数のケースを持っていますさまざまなサイズのコホート、したがって一意のIDの割合を選択する必要があります。いかなる援助も感謝します。

data %>% group_by(Cohort) %>% 
    filter(ID %in% sample(unique(ID), ceiling(0.4*length(unique(ID))))) 

これは、ランダムにサンプリングされたIDを含むすべての行を返します。

+0

再現しないのはなぜあなたが持っている問題、そうでなければ私達はそれを理解できません...あなたは複数のIDを持っているなら、この機能を使ってデータを生成してください;) – Arthur

答えて

7

は、ここに1つの方法です。言い換えれば、私はあなたが各行に行く測定値を持っていると仮定して、あなたは各サンプリングされたIDのすべての測定をしたいと思っています。 (あなただけの場合1つの行がそれを行いますbramtaylの答え@その後、各サンプリングされたIDに対して返さ。)例えば

data = data.frame(rbind(data, data), value=rnorm(2*nrow(data))) 

data %>% group_by(Cohort) %>% 
    filter(ID %in% sample(unique(ID), ceiling(0.4*length(unique(ID))))) 

    Cohort  ID  value 
    (int) (fctr)  (dbl) 
1  1 a1 -0.92370760 
2  1  a2 -0.37230655 
3  1  a3 -1.27037502 
4  1  a7 -0.34545295 
5  2 b14 -2.08205561 
6  2 b17 0.31393998 
7  2 b18 -0.02250819 
8  2 b19 0.53065857 
9  2 b20 0.03924414 
10  1 a1 -0.08275011 
11  1  a2 -0.10036822 
12  1  a3 1.42397042 
13  1  a7 -0.35203237 
14  2 b14 0.30422865 
15  2 b17 -1.82008014 
16  2 b18 1.67548568 
17  2 b19 0.74324596 
18  2 b20 0.27725794 
4

library(dplyr) 

data %>% 
    select(ID, Cohort) %>% 
    distinct %>% 
    group_by(Cohort) %>% 
    sample_frac(0.4) %>% 
    left_join(data) 
あなたがデータを提供する必要があり
関連する問題