从一袋彩色弹珠中抽取;每次抽取移除该颜色的所有弹珠
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"
我想按照一些简单的规则从一袋彩色弹珠中抽取而无需更换。有多个相同颜色的弹珠(例如,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(...))
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"