R迭代地从向量中选择和移除值

时间:2017-11-13 14:02:08

标签: r probability sample

我想迭代地从矢量中选择一些值(基于硬币投掷决策概率)并从该矢量中移除它们,然后在下一个迭代循环中,我再次想要选择(在抛硬币之后) )来自剩余矢量值的值。直到我达到我的矢量为空的程度。以下是我脑海中的解决方案,但最后我在向量中遇到了一个未选中的值:

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次,并且我希望在每次迭代中根据不同类型的选择得到不同的结果。

1 个答案:

答案 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")
}