leffgh
如题,
将一个向量随机重新排列,重复一千次
写了一个程序可以实现,但是用了两层的循环,太慢了,
处理一个6万多元素的向量,运行一晚都没出结果
karlqi
楼上所说的用replicate lapply sapply之类固然可以节约一定的时间,但是却忽略了问题的关键,
观察x<-replicate(1000,sample(60000))可以发现,其实这段代码只在最后做了一次赋值,前999次sample(60000)没有起到任何效果,这显然不是楼主想要的(楼主希望将一个向量随机重新排列一千次而不是一次)。我们知道,不管是R还是SPLUS,单纯计算sample(60000)是花不了多少时间的,时间多花在赋值上,即x<-的过程,楼主之所以会花比较长的计算时间,也正是因为需要进行1000次重排赋值,即做1000次x<-,一两分钟已经是很快的了。实际也证明replicate lapply sapply能减少30-50%的运算时间就不错了,减少95%以上的计算时间简直是不可思议的
e.g.:
data0<-c(0.1, 0.4, 0.6, 0.7)
x<-replicate(4,sample(10))得
x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 2 2 3 3 3 3 2 2 2 2
[2,] 4 4 1 1 1 1 1 3 3 4
[3,] 1 1 2 4 2 2 4 4 4 1
[4,] 3 3 4 2 4 4 3 1 1 3
以上过程不花什么时间!
以下过程才是花时间的:
c(0.1, 0.4, 0.6, 0.7) 根据x[,1]重排成
c(0.4, 0.7, 0.1, 0.6) 再根据x[,2]重排成
c(0.7, 0.6, 0.4, 0.1) 再根据x[,3]重排成
c(0.4, 0.7, 0.6, 0.1) ......
leffgh
[quote]引用第5楼karlqi于2007-11-13 22:27发表的“”:
楼上所说的用replicate lapply sapply之类固然可以节约一定的时间,但是却忽略了问题的关键,
观察x<-replicate(1000,sample(60000))可以发现,其实这段代码只在最后做了一次赋值,前999次sample(60000)没有起到任何效果,这显然不是楼主想要的(楼主希望将一个向量随机重新排列一千次而不是一次)。我们知道,不管是R还是SPLUS,单纯计算sample(60000)是花不了多少时间的,时间多花在赋值上,即x<-的过程,楼主之所以会花比较长的计算时间,也正是因为需要进行1000次重排赋值,即做1000次x<-,一两分钟已经是很快的了。实际也证明replicate lapply sapply能减少30-50%的运算时间就不错了,减少95%以上的计算时间简直是不可思议的
e.g.:
data0<-c(0.1, 0.4, 0.6, 0.7)
.......[/quote]
没有看懂,
我原来是先用sample产生从1:70000的不重复的随机整数,作为那个向量的下标,
然后通过一个循环一个个把向量的元素与新的下标连接起来,这样做一千次非常慢
后来想想,可以直接对向量用sample ,这样也可以将它重新排列
比如a<-seq(1,100,0.2)
sample(a,length(a),replace=FALSE)->newa
这个newa 就是对a中元素的一种新的排列