2016-04-21 55 views
1

我有以下問題:
我有4袋20個值在每個當中,並且我隨機從各4袋挑10的樣品:重新樣品

for (i in 1:20){ 
    bag1[i] = sample(0:50,1) 
    bag2[i] = sample(0:50,1) 
    bag3[i] = sample(0:50,1) 
    bag4[i] = sample(0:50,1) 
} 

for (j in 1:10){ 
    samp=sample(1:20,1) 
    bag1value=bag1value+bag1[samp] 
    bag2value=bag2value+bag2[samp] 
    bag3value=bag3value+bag3[samp] 
    bag4value=bag4value+bag4[samp] 
} 

現在,我想再次從第一個樣本中具有最大值值的包中抽取10個值。所以我可以這樣做:

maxbag=max(bag1value,bag2value,bag3value,bag4value) 
if (maxbag==bag1value){ 
    for (j1 in 1:10){ 
     samp=sample(1:20,1) 
     secondsample=secondsample+bag1[samp] 
    } elseif (maxbag==bag2value){ 
     samp=sample(1:20,1) 
     secondsample=secondsample+bag2[samp] 
    } 

但我正在尋找一個更優雅的方式來做到這一點。

回答

1

您的代碼目前無法使用。參數j和j1不存在於派生袋值和秒樣本的兩個for循環中。

無論如何,處理數據的更優雅的方式是使用列表或數組。第一環路可以與下面的數組「袋」來替換,以將列1:4表示袋1至4:

bags<-sapply(1:4, function(x) sample(1:50, 20, replace=T)) 
colnames(bags) <- paste0("bag", 1:4) 
head(bags) 

    bag1 bag2 bag3 bag4 
[1,] 7 1 14 16 
[2,] 50 23 49 7 
[3,] 14 48 26 10 
[4,] 42 11 8 10 
[5,] 31 43 11 9 
[6,] 5 20 27 19 

拿起10從每個袋子:

new <- sapply(colnames(bags), function(x)sample(bags[,x], 10, replace=F)) 
head(new) 

    bag1 bag2 bag3 bag4 
[1,] 14 1 49 2 
[2,] 31 26 13 18 
[3,] 1 48 14 9 
[4,] 38 23 27 6 
[5,] 24 23 26 10 
[6,] 14 42 8 29 

爲了確定該袋包含最大值:

secondsample <- sample(bags[,max.bag], 10) 
secondsample 

[1] 8 13 27 14 31 13 49 29 38 5 

max.new <- sapply(1:4, function(x) max(new[,x])) 
max.new 

[1] 38 48 49 29 

max.bag <- colnames(bags)[max.new==max(max.new)] 

袋最大值的重定

+0

非常感謝!但是,當我抽樣時,我怎麼能這樣做,我爲每個袋子使用相同的「行」?例如,我決定採樣行[3],新樣本的輸出將是(14,48,26,10)。 – YefR

+0

行李在列中,而不是行。你可以用樣品(袋子[,「bag1」],10)來說樣品「bag1」。' –

+0

當選擇第二個樣品時,這個代碼在「tie」的情況下可能有問題。爲了避免這個問題,我想我們應該寫:secondsample < - sample(bags [,max.bag [1]],10)或max.bag <-max.bag [sample(1)]。 – YefR