是否有 R 函数用于从 1:n 到 n 向量进行采样?

Is there an R function for sampling from 1:n across a vector of n's?

提问人:Dan Lewer 提问时间:11/14/2023 更新时间:11/14/2023 访问量:84

问:

我试图在 1 和 之间选择一个随机值,给定一个向量 's。这是我目前的解决方案:nn

n <- c(10, 5, 35, 16, 2)
sapply(n, function (x) sample(seq_len(x), 1))

然而,这似乎是一个低效的解决方案,因为我每次都从 1:n 循环和采样。有没有更有效的方法?n

R 循环 矢量化

评论

1赞 nightstand 11/14/2023
试试这个吧? - 你仍然在 n 上循环,但你不必每次都输入一个向量 1:n(假设你只想要整数)sapply(n, function(x) sample.int(x, 1))
9赞 Andrew Gustar 11/14/2023
或者根本不需要循环ceiling(n * runif(n))
1赞 Limey 11/14/2023
@AndrewGustar请发表您的评论(和演示)作为 n 个答案。
1赞 Carl Witthoft 11/14/2023
@AndrewGustar值得补充的是,这是由于它使用了一个奇怪的部分,即它使用长度而不是任何,当它是一个向量时。runifnn

答:

2赞 Andrew Gustar 11/14/2023 #1

你可以在没有循环的情况下做到这一点

ceiling(n * runif(n))

根据文档,if 是向量,则被视为 .nrunif(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 的项目中提取,但这似乎注定效率较低。也许不是,程序员经常被引诱到长达数小时的调查中,而这些调查并不是真正必要的,只是为了满足一些对卓越效率的要求。samplen