R 有效地从向量中移除n个随机项,其中n可以是0
我想从向量中随机选取n个元素,其中n大于或等于0。 n是从二项式中采样的,很小,可能是0。 我希望尽可能高效地执行此操作,以便代码可以多次运行。问题在于,如果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
vec[-sample(vec,n)]
可能会给出一个空向量
我有几个想法,我想知道是否有人知道一个更好或更快的方法来解决这个问题
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