您可以使用my stratified
function,指定值< 1爲您比例如下:
## Sample data. Seed for reproducibility
set.seed(1)
N <- 50
myData <- data.frame(a=1:N,b=round(rnorm(N),2),group=round(rnorm(N,4),0))
## Taking the sample
out <- stratified(myData, "group", .3)
out
# a b group
# 17 17 -0.02 2
# 8 8 0.74 3
# 25 25 0.62 3
# 49 49 -0.11 3
# 4 4 1.60 3
# 26 26 -0.06 4
# 27 27 -0.16 4
# 7 7 0.49 4
# 12 12 0.39 4
# 40 40 0.76 4
# 32 32 -0.10 4
# 9 9 0.58 5
# 42 42 -0.25 5
# 43 43 0.70 5
# 37 37 -0.39 5
# 11 11 1.51 6
將最終組中的計數與我們所預期的相比較。
round(table(myData$group) * .3)
#
# 2 3 4 5 6
# 1 4 6 4 1
table(out$group)
#
# 2 3 4 5 6
# 1 4 6 4 1
您也可以輕鬆取樣品固定數量的每個組,就像這樣:
stratified(myData, "group", 2)
# a b group
# 34 34 -0.05 2
# 17 17 -0.02 2
# 49 49 -0.11 3
# 22 22 0.78 3
# 12 12 0.39 4
# 7 7 0.49 4
# 18 18 0.94 5
# 33 33 0.39 5
# 45 45 -0.69 6
# 11 11 1.51 6
阿難,感謝您的回覆。我有一個關於你的代碼溫度<一個問題 - lapply( 名(df.split), 函數(x)的df.split [[X]] [樣品(df.table [X], N [X],更換= replace),])看起來你正在做替換抽樣。這可能會導致重複樣本。是對的嗎? – user288609 2014-09-30 02:39:21
@ user288609,有什麼問題? :-)到那時爲止的所有代碼都是確定每層的樣本大小。這是抽樣實際發生的階段。它循環遍歷一個已按組拆分的「data.frame」,並從每個子集中對所需的行數進行採樣。 – A5C1D2H2I1M1N2O1R2T1 2014-09-30 02:44:18
@ user288609,no。除非在調用函數時使用'replace = TRUE'。 (對不起,當我開始撰寫我的評論時,你的問題不存在) – A5C1D2H2I1M1N2O1R2T1 2014-09-30 02:44:49