我想迭代地从矢量中选择一些值(基于硬币投掷决策概率)并从该矢量中移除它们,然后在下一个迭代循环中,我再次想要选择(在抛硬币之后) )来自剩余矢量值的值。直到我达到我的矢量为空的程度。以下是我脑海中的解决方案,但最后我在向量中遇到了一个未选中的值:
vector <- c("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10")
for (i in 1:10) {
#select values from the vector based on coin-toss probability, so that roughly half of the items get selected
selected <- sample(vector, replace = F, size = length(vector)/2)
print(slected)
# Do some operation with slected values
# remove the selcted values from the original vector
vector <- vector[!vector%in%selected]
print(vector)
# as we are in loop this will keep happening until we are done selecting all of the elements in the vector.
}
NOTE: I don't want to select any value twice!
任何人都可以指导我为此提供更好的解决方案。
编辑:可以选择基于投币的选择,我没有明确给出尺寸。例如,对于向量中的每个值,我们计算选择的概率,如果它高于0.5,则该值被选中而不是其他值。
我想这样做是因为我希望迭代这个向量1000次,并且我希望在每次迭代中根据不同类型的选择得到不同的结果。
答案 0 :(得分:2)
这是一个不同的解决方案。请注意,最重要的更改是使用ceiling
来定义样本大小。
x <- c("item1", "item2", "item3", "item4", "item5", "item6", "item7",
"item8", "item9", "item10")
while(length(x) > 0) {
selected <- sample(x, replace = FALSE, size = ceiling(length(x)/2))
cat("selected:", selected, "\n")
x <- x[!x %in% selected]
cat("remaining:", x, "\n\n")
}
selected: item5 item3 item8 item10 item4
remaining: item1 item2 item6 item7 item9
selected: item1 item2 item9
remaining: item6 item7
selected: item6
remaining: item7
selected: item7
remaining:
我还使用了while
循环而不是OP for
循环,因为这在概念上更有意义。
关于OP的评论:
您还可以尝试以下内容,而不必定义正在选择的样本大小。但请注意,即使每个元素的概率为0.5,这很容易导致某些情况下未选择任何元素或所有元素:
x <- c("item1", "item2", "item3", "item4", "item5", "item6", "item7",
"item8", "item9", "item10")
while(length(x) > 0) {
selected <- x[sample(c(TRUE, FALSE), size = length(x), replace = TRUE)]
cat("selected:", selected, "\n")
x <- x[!x %in% selected]
cat("remaining:", x, "\n\n")
}