我想从一袋彩色大理石中抽出而不需要按照一些简单的规则进行更换。有多个相同颜色的大理石(例如,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)
任何指针都会非常感激。
答案 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语句,因为如果抽奖的数量高于大理石的数量,我就不知道你想做什么。