向量的有效随机重新排序

时间:2014-02-03 07:58:52

标签: r random vector

使用随机化测试需要用户随机将某些矢量等重新排序为空模型。

在我的情况下,我有一个10,000个元素的向量,我必须从中重新取样。我们现在就这样做:

x <- sample(c(TRUE, FALSE), 10000, TRUE)

所以我的实际数据看起来像x。我想随机重新排序矢量xn次。这可以完成:

lapply(1:1000, function(i) sample(x))

在这种情况下,需要进行1000次重复:

start <- Sys.time()
lapply(1:1000, function(i) sample(x))
Sys.time() - start

Time difference of 10.20258 secs

现在考虑必须进行一些额外的计算,这是针对距离矩阵中的一个单元格。现在将此开销乘以i x j矩阵,这会耗费大量时间。 是否有更快的方式重新调整x向量(最好是在基数R中)n次?我使用list结构但是如果矩阵结构更多高效我对任何事情持开放态度。在我的列表中,各个元素与原始x具有完全相同的TRUE / FALSE比例。这是随机化测试的关键。

2 个答案:

答案 0 :(得分:4)

在R中打印可能很慢(更不用说并非所有内容都会被打印到屏幕上)。

尝试改为分配输出:

> start <- Sys.time()
> out <- lapply(1:1000, function(i) sample(x))
> Sys.time() - start
Time difference of 0.7525001 secs

答案 1 :(得分:4)

在大多数情况下,vapplylapply快。您还可以考虑replicate进行简单复制,因为所有采样都独立于i

fun1 <- function() lapply(1:1000, function(i) sample(x))
fun2 <- function() vapply(1:1000, function(i) sample(x), FUN.VALUE = x)
fun3 <- function() replicate(1000, sample(x), simplify = FALSE)

library(microbenchmark)
microbenchmark(fun1(), fun2(), fun3())

Unit: milliseconds
   expr      min       lq   median       uq       max neval
 fun1() 363.3359 387.9058 531.3358 731.9839  9850.098   100
 fun2() 403.4411 469.3090 587.7403 747.8655 15495.549   100
 fun3() 363.2694 374.1643 516.9334 600.4151  6231.890   100

 # Note that `vapply` returns a matrix, not a list.

函数replicate似乎对此任务稍微有效。