R 有效地从向量中移除n个随机项,其中n可以是0

R 有效地从向量中移除n个随机项,其中n可以是0,r,performance,syntax,R,Performance,Syntax,我想从向量中随机选取n个元素,其中n大于或等于0。 n是从二项式中采样的,很小,可能是0。 我希望尽可能高效地执行此操作,以便代码可以多次运行。问题在于,如果n=0,使用vec[-sample(vec,n)]可能会给出一个空向量 我有几个想法,我想知道是否有人知道一个更好或更快的方法来解决这个问题 之前使用减号和if函数 y是长度为10000的向量 n创建一个布尔向量,指示是否保留每列的TRUE或FALSE: p = 0.0001 keep = sample(c(TRUE, FALSE), si

我想从向量中随机选取n个元素,其中n大于或等于0。 n是从二项式中采样的,很小,可能是0。 我希望尽可能高效地执行此操作,以便代码可以多次运行。问题在于,如果n=0,使用
vec[-sample(vec,n)]
可能会给出一个空向量

我有几个想法,我想知道是否有人知道一个更好或更快的方法来解决这个问题

  • 之前使用减号和if函数
  • y是长度为10000的向量
    n创建一个布尔向量,指示是否保留每列的
    TRUE
    FALSE

    p = 0.0001
    keep = sample(c(TRUE, FALSE), size = length(y), prob = c(1 - p, p), replace = TRUE)
    y[keep]
    
    您可以使用
    runif
    执行相同的操作,这可能会稍微快一点:

    y[runif(length(y)) > p]
    
    事实上,
    sample
    的速度快了大约2倍——尽管我们测量的是微秒,这并不重要

    n = 10000
    p = 0.0001
    y = rnorm(n)
    
    microbenchmark::microbenchmark(
      sample = y[sample(c(TRUE, FALSE), size = n, prob = c(1 - p, p), replace = TRUE)],
      runif = y[runif(n) > p]
    )
    # Unit: microseconds
    #    expr   min     lq    mean median     uq     max neval
    #  sample 128.9 195.05 463.591  297.9 346.65 15319.9   100
    #   runif 349.0 565.80 876.925  674.3 800.55  6990.6   100
    

    也可以
    rbinom(n,1,1-p)
    但是速度较慢。@jay.sf,这也需要
    as.logical()
    包装器。(这并不需要任何时间)@GregorThomas是的,那也是!
    y[runif(length(y)) > p]
    
    n = 10000
    p = 0.0001
    y = rnorm(n)
    
    microbenchmark::microbenchmark(
      sample = y[sample(c(TRUE, FALSE), size = n, prob = c(1 - p, p), replace = TRUE)],
      runif = y[runif(n) > p]
    )
    # Unit: microseconds
    #    expr   min     lq    mean median     uq     max neval
    #  sample 128.9 195.05 463.591  297.9 346.65 15319.9   100
    #   runif 349.0 565.80 876.925  674.3 800.55  6990.6   100