gpt4 book ai didi

r - 从向量中有效地删除 n 个随机条目,其中 n 可能为 0

转载 作者:行者123 更新时间:2023-12-04 01:12:58 24 4
gpt4 key购买 nike

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

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

  1. 之前使用减号和 if 函数。
# y is a vector of length 10000
n <- rbinom(n = 1, size = 10000, p = 0.0001)
if (length(n) != 0){
y <- y[-sample((1:10000), size = n)]
}
  1. 选择所有其他元素。
# y is a vector of length 10000
n <- rbinom(n = 1, size = 10000, p = 0.0001)
n <- 10000 - n
y <- sample(y, size = n)

最佳答案

创建一个 bool 向量,指示是否保留每一列 TRUEFALSE:

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

关于r - 从向量中有效地删除 n 个随机条目,其中 n 可能为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com