如何从随机选择中排除值

How to exclude values from random selection

这是独立的,但与这个问题有关

使用 mtcars 数据集,我现在设法从特定列中随机 select 一个值:在本例中来自 cyl 列。

mtcars[sample(1:nrow(mtcars), 1),2]

此码随机赠送 [1] 6[1] 8 或 ...

现在我想排除一个要选择的特定值,在这个例子中说cyl==8。 我会将值存储在一个向量中,例如:

not_select <- 8

mtcars[sample(1:nrow(mtcars), 1),2]

我的问题:如何将 not_select 集成到 mtcars[sample(1:nrow(mtcars), 1),2]

预期输出:随机样本不应包括 8

更新: 例如输出应该是: 64

由于情况不明更新二:

我想从 cyl 列中随机 select 一个值。此值不应为 8。所以该值将是 46.

解释:8是正确答案。我正在用 cyl 列中的其他值(例如 4 和 6)随机构造错误答案。

能不能根据not_select加个过滤条件?

mtcars[sample(1:nrow(mtcars), 1) & mtcars$cyl != not_select, 2]

更新:怎么样:

not_select <- 8

draw_cyl <- sample(unique(mtcars$cyl[mtcars$cyl != not_select]), 1)

mtcars %>%
  filter(cyl == draw_cyl) %>%
  slice_sample(n = 1) %>%
  pull(cyl)

或者按照 TarJae 自己的建议(所以我没有任何功劳!):

mtcars[sample(which (mtcars[,2] != not_select), 1), 2]

如果输出匹配not_selected,这个递归函数将再次运行。

exclude_not_selected <- function(not_selected) {
  value <- mtcars[sample(1:nrow(mtcars), 1),2] 
  if (value == not_selected) {
    exclude_not_selected(not_selected)
  } else {
    return(value)
  }
}

exclude_not_selected(8)
[1] 4

也许,另一种方式-

tmp <- mtcars[, 2] 
sample(tmp[tmp != not_select], 1)

以上给出了根据每个值在数据集中的出现来选择每个值的概率。如果您希望无论发生多少次概率都相等,您可以只考虑 unique 个值。

tmp <- unique(mtcars[, 2])
sample(tmp[tmp != not_select], 1)