随机的矢量化并行选择?

Gab*_*iel 3 r vectorization random-sample

我有两个矢量"H"和"L",它们有200个数值.我想创建一个名为"HL"的第三个向量,它包含来自H和L的200个随机样本.但是,我希望它们能够并行选择,就像pmin和pmax函数一样.

简化示例:

H <- 1:5
L <- 6:10

# rbind(H,L)
#   [,1] [,2] [,3] [,4] [,5]
# H    1    2    3    4    5
# L    6    7    8    9   10
# intended result is then a random pick from each 'column' shown above, e.g:

HL <- c(6,2,8,4,10)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用循环的情况下执行此操作?

任何建议将不胜感激谢谢

Ric*_*rta 7

您需要来自bernouli(即0或1)分布的N个样本,其中N是H/L中的值的数量.然后使用采样分别从H或L中选取.使用ifelse确保您需要的"并行选择".

set.seed(1)
N <- length(H)
HorL <- rbinom(N, 1, 0.5)

# the select
results <- ifelse(HorL, H, L)

results
# [1]  6  7  3  4 10
Run Code Online (Sandbox Code Playgroud)

这一切都包装成一个漂亮的衬垫:

ifelse( rbinom(H, 1, 0.5), H, L)
Run Code Online (Sandbox Code Playgroud)

来自@Arun:一种(相对)更快的实现方式(不需要ifelse)将是:

idx <- which(!as.logical(rbinom(H, 1, 0.5)))
vv <- H
vv[idx] <- L[idx]
Run Code Online (Sandbox Code Playgroud)

说明

@Gabriel,我们的想法是你从两个选项中选择一个.您可以有效地翻转硬币,如果是头部,则从H中选择,如果是尾部,则从L中选择.这是伯努利分布,更一般的形式是二项分布.R有一个提供随机数量的时尚设施.

因此,我们要求R中的N许多,然后相应地从H或L中选择.

"选择......"部分是R诡计.

  • 请注意,我们可以将其0, 1视为TRUE, FALSEA, B等.

  • 使用这种ifelse方法应该有点自我解释.如果为TRUE,则从一个源中选择,如果为FALSE,则从另一个源中选择.

Arun的方法更有创意.他的方法使用相同的"翻转硬币"机制来选择套装,但具有速度的好处.(我们说纳秒,但仍然).他的方法基本上说:

  • 从一组开始,比如H.
  • 抛硬币.
  • 每当硬币是Tails时,用L的相同索引元素替换H的元素. (请注意,"相同索引"方面是您所称的"并行选择")