time<-c(10,20)
d<-NULL
for (i in seq(length(time)))
d<-c(d,seq(0,(time[i]-1)))
d
当time<-c(3000,4000,2000,...,5000)
和时间长度为1000时,该过程非常缓慢。 有没有更快的方式生成序列没有循环?如何不通过循环生成以下序列?
感谢您的帮助。
time<-c(10,20)
d<-NULL
for (i in seq(length(time)))
d<-c(d,seq(0,(time[i]-1)))
d
当time<-c(3000,4000,2000,...,5000)
和时间长度为1000时,该过程非常缓慢。 有没有更快的方式生成序列没有循环?如何不通过循环生成以下序列?
感谢您的帮助。
尝试d <- unlist(lapply(time,function(i)seq.int(0,i-1)))
在一个旁注,一方面减慢了整个事情,就是你成长的循环中的向量的事实。
> time<-sample(seq(1000,10000,by=1000),1000,replace=T)
> system.time({
+ d<-NULL
+ for (i in seq(length(time)))
+ d<-c(d,seq(0,(time[i]-1)))
+ }
+)
user system elapsed
9.80 0.00 9.82
> system.time(d <- unlist(lapply(time,function(i)seq.int(0,i-1))))
user system elapsed
0.00 0.00 0.01
> system.time(unlist(mapply(seq, 0, time-1)))
user system elapsed
0.11 0.00 0.11
> system.time(sequence(time) - 1)
user system elapsed
0.15 0.00 0.16
编辑:其他的解决方案添加时间以及
time<-c(10, 20, 30)
unlist(mapply(seq, 0, time-1))
[1] 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
[26] 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[51] 20 21 22 23 24 25 26 27 28 29
+1显示应用程序。 – 2011-03-25 14:51:33
这比环快得多,但并不完全一样快,前面显示的mapply
和lapply
解决方案;然而,它非常简单:
sequence(time) - 1
它在内部使用lapply
。
+1不错!....... – 2011-03-25 14:58:33
有趣的是,实际上内部函数或多或少是我的解决方案(稍后由于不得不从整个向量中减去1而丢失一点点时间)。然而,如果我使用内部代码,它会运行0.03,这比在绕同一代码封装函数()后快5倍。 – 2011-03-25 15:02:16
正如@Joris暗示的那样,你的解决方案表现不佳的原因是由于矢量的增长。如果您只是猜测矢量的大小并相应地分配了内存,那么您的解决方案将会执行正常 - 但仍然不是最佳选择。
以@Joris为例,我的机器上的解决方案花费了22秒。通过预先分配一个大的矢量,我们可以将其减少到大约0.25secs
> system.time({
+ d = numeric(6000000); k = 1
+ for (i in seq(length(time))){
+ l = time[i]-1
+ d[k:(k+l)] = 0:l
+ k = k +l + 1
+ }}
+)
user system elapsed
0.252 0.000 0.255
+1为我打了7分钟! – Andrie 2011-03-25 14:49:13
+1尼斯比较。 – csgillespie 2011-03-25 16:26:43