从一袋彩色大理石中抽出;每次抽奖都会删除该颜色的所有大理石

时间:2018-02-24 21:52:21

标签: r list vector dplyr sample

我想从一袋彩色大理石中抽出而不需要按照一些简单的规则进行更换。有多个相同颜色的大理石(例如,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) 

任何指针都会非常感激。

3 个答案:

答案 0 :(得分:1)

我们可以设计一个功能来完成采样任务。每次采样后,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"

答案 1 :(得分:1)

您的数据

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(...))

将您的矢量转换为比例表
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"

答案 2 :(得分:0)

我会选择类似的东西

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

您实际执行的操作是:删除由color绘制的所有大理石bag <- bag[!bag %in% color]

我提出了一个if语句,因为如果抽奖的数量高于大理石的数量,我就不知道你想做什么。