从一袋彩色弹珠中抽取;每次抽取移除该颜色的所有弹珠

Draw from a bag of colored marbles; for each draw remove all marbles of that color

我想按照一些简单的规则从一袋彩色弹珠中抽取而无需更换。有多个相同颜色的弹珠(例如,5 个蓝色、3 个红色、7 个黄色、4 个绿色)。假设我画了 3 个弹珠,一次画了一个弹珠。每次抽奖后,我都会移除该颜色的所有弹珠。例如,我选择了一个绿色,我从袋子里取出了所有绿色弹珠;我选了一个红色,我从袋子里取出所有红色弹珠,等等

我不完全清楚如何最有效地移除与焦点绘制相同颜色的所有弹珠,而无需大量的 for 循环。下面的虚拟代码仅根据绘制矢量绘制弹珠。

#Dummy code
set.seed(123)
multiple_draws <- c(3,2,4,1)
bag <- c(rep("blue",5),rep("red",3),rep("yellow",7),rep("green",4))

sapply(seq(length(multiple_draws)), function(i) sample(bag, multiple_draws[i],replace=F), simplify=F) 

任何指针将不胜感激。

我会去做那样的事情

for(draw in multiple_draws){
  if(length(bag)>draw){
  color <- unique(sample(bag, draw,replace=F))
  bag <- bag[!bag %in% color]}
}

你实际上做了你会做的事情:你删除了你 bag <- bag[!bag %in% color] 绘制的所有大理石 color

我放了一个 if 语句,因为我不知道如果平局数大于弹珠数你想做什么。

我们可以设计一个函数来完成采样任务。每次采样后,bag <- bag[!bag %in% s] 会完全去除该颜色。

# Dummy code
set.seed(123)
multiple_draws <- c(3, 2, 4, 1) # No draw is larger than 4
bag <- c(rep("blue",5),rep("red",3),rep("yellow",7),rep("green",4))

# A function for sampling
sample_fun <- function(draw, bag){
  ans <- numeric()
  for (i in 1:draw){
    s <- sample(bag, 1, replace = FALSE)
    bag <- bag[!bag %in% s]
    ans[i] <- s
  }
  return(ans)
}

# Apply the function through multiple_draws
lapply(multiple_draws, sample_fun, bag = bag)
# [[1]]
# [1] "red"   "green" "blue" 
# 
# [[2]]
# [1] "green"  "yellow"
# 
# [[3]]
# [1] "blue"   "yellow" "green"  "red"   
# 
# [[4]]
# [1] "yellow"

您的数据

set.seed(123)
multiple_draws <- c(3,2,4,1)
bag <- c(rep("blue",5),rep("red",3),rep("yellow",7),rep("green",4))

使用 prop.table(table(...))

将矢量转换为 table 比例
prop.table(table(bag))

# bag
     # blue     green       red    yellow 
# 0.2631579 0.2105263 0.1578947 0.3684211

您可以对 bag 中的唯一值进行采样,将概率设置为比例

custom_sample <- function(vec, T) {
    sample(names(prop.table(table(vec))), T, replace=FALSE, prob=prop.table(table(vec)))
}
lapply(multiple_draws, function(T) custom_sample(bag, T))
# [[1]]
# [1] "yellow" "red"    "blue"  

# [[2]]
# [1] "red"   "green"

# [[3]]
# [1] "yellow" "green"  "red"    "blue"  

# [[4]]
# [1] "blue"