我一直在这里寻找解决我的问题的办法,但我没有看到一个。
在R中,我试图为一个让我们熟悉软件的项目模拟交易或不交易。我计划这是一个大的循环,但我不能让我的第二个循环工作。我将其分解为便于阅读(对我来说是调试/测试)。
这个循环模拟了我们在整个游戏中选择的原始案例。
for(i in 1){
cases <- 1:26
originalpick <- sample(cases, 1, replace = FALSE) #choose a case
casesremaining <- (length(cases) - 1) #subtract original case from cases
}这个循环模拟了我们挑选的第一个要播放的案例。
for(i in 1){
casepicked <- replicate(1,sample(cases[-c(originalpick)], 1, replace = FALSE))
}我的问题是,我有可能再次选择我的原案。由于这个原因,我使用了示例,因为我可以关闭替换,而且由于这不起作用,我认为复制会有帮助。我已经看到了更新功能,但我似乎也无法让它发挥作用。
这本质上就是游戏,因为我必须选择案例,直到我剩下两个案例(最初的案例和从案例中留下的变量)。
我对R还很陌生,所以这可能只是我对功能的误解吗?任何帮助都将不胜感激!
发布于 2015-04-29 05:38:34
假设您想要模拟选择用例的顺序,则可以通过对sample的单个调用(如果要执行多个模拟,则用replicate包装)来完成这一任务。
例如:
set.seed(1)
cases <- 1:26
picks <- sample(cases)
picks
## [1] 7 10 14 21 5 19 23 13 12 2 4 3 25 22 24 6 8 9 16 11 26 17 15 1 18 20当不提供额外的参数时,sample(x)只会置换向量x。上面,最初选择的案例是案例7,picks的其余元素代表随后选择的案例。
要执行多个模拟:
picks3 <- replicate(3, sample(cases))
## [,1] [,2] [,3]
## [1,] 1 12 21
## [2,] 10 7 25
## [3,] 21 2 11
## [4,] 8 3 17
## [5,] 11 25 9
## [6,] 13 11 7
## [7,] 25 14 16
## [8,] 4 8 4
## [9,] 15 17 13
## [10,] 12 5 3
## [11,] 24 19 19
## [12,] 2 18 23
## [13,] 22 10 20
## [14,] 6 4 1
## [15,] 20 6 8
## [16,] 23 9 10
## [17,] 14 1 12
## [18,] 5 16 24
## [19,] 9 23 14
## [20,] 16 26 15
## [21,] 26 21 5
## [22,] 3 24 22
## [23,] 17 15 26
## [24,] 19 22 2
## [25,] 7 13 18
## [26,] 18 20 6现在,每一列都是对挑选顺序的独立模拟。
为了感兴趣,使用for循环一次模拟一个选择(例如,如果您想在过程中插入其他步骤),您可以执行如下操作(尽管有很多方法):
picks <- sample(cases, 1) # original pick
for (i in 2:length(cases)) { # subsequent picks
remaining <- setdiff(cases, picks)
picks[i] <- remaining[sample(length(remaining), 1)]
}注意:我们使用remaining[sample(length(remaining), 1)]而不仅仅是sample(remaining, 1),因为在上一次迭代时,remaining将是一个数字(最后一个剩余情况的编号)。将单个数字(例如4 )传递给sample将导致sample(1:4, 1)而不是所需的sample(4, 1)。有关这方面的更多信息,请参见this post。
https://stackoverflow.com/questions/29934741
复制相似问题