2016-04-21 24 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