提问人:Dan Lewer 提问时间:11/14/2023 更新时间:11/14/2023 访问量:84
是否有 R 函数用于从 1:n 到 n 向量进行采样?
Is there an R function for sampling from 1:n across a vector of n's?
问:
我试图在 1 和 之间选择一个随机值,给定一个向量 's。这是我目前的解决方案:n
n
n <- c(10, 5, 35, 16, 2)
sapply(n, function (x) sample(seq_len(x), 1))
然而,这似乎是一个低效的解决方案,因为我每次都从 1:n 循环和采样。有没有更有效的方法?n
答:
2赞
Andrew Gustar
11/14/2023
#1
你可以在没有循环的情况下做到这一点
ceiling(n * runif(n))
根据文档,if 是向量,则被视为 .n
runif(n)
runif(length(n))
评论
1赞
ThomasIsCoding
11/14/2023
你也可以试试round(runif(n, 1, n))
0赞
Carl Witthoft
11/14/2023
@ThomasIsCoding但这会产生偶尔的零值。OP 要求 1 到 n
0赞
ThomasIsCoding
11/15/2023
@CarlWitthoft 没有给出 、 、 确实是矢量化的。runif(n,1,n)
1:n[1]
1:n[2]
1:n[length(n))
runif
0赞
Carl Witthoft
11/15/2023
@ThomasIsCoding哎呀,是的,你是对的。道歉。
-1赞
IRTFM
11/14/2023
#2
到目前为止,这个问题因未能指定是否希望分布或样本集是离散的而受到损害。您的解决方案建议您希望它是离散的,但对 1 和 n 之间的单个随机值的请求将是:
runif(1, 1, n)
...而从离散空间 1:n 请求“随机值”将是
sample( 1:n, 1)
你对第二种可能性的解决方案似乎是明智的。如果你通过测试发现该函数在某种程度上“减慢了你的速度”,那么你可以先找到 的最大值,然后创建一个随机值的向量,形成 1:nmax,然后使用带有 round 或 ceiling 的 runif 从小于 n 的项目中提取,但这似乎注定效率较低。也许不是,程序员经常被引诱到长达数小时的调查中,而这些调查并不是真正必要的,只是为了满足一些对卓越效率的要求。sample
n
评论
sapply(n, function(x) sample.int(x, 1))
ceiling(n * runif(n))
runif
n
n