2011-03-25 52 views
5
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时,该过程非常缓慢。 有没有更快的方式生成序列没有循环?如何不通过循环生成以下序列?

感谢您的帮助。

回答

8

尝试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 

编辑:其他的解决方案添加时间以及

+0

+1为我打了7分钟! – Andrie 2011-03-25 14:49:13

+0

+1尼斯比较。 – csgillespie 2011-03-25 16:26:43

3
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 
+0

+1显示应用程序。 – 2011-03-25 14:51:33

6

这比环快得多,但并不完全一样快,前面显示的mapplylapply解决方案;然而,它非常简单:

sequence(time) - 1 

它在内部使用lapply

+0

+1不错!....... – 2011-03-25 14:58:33

+0

有趣的是,实际上内部函数或多或少是我的解决方案(稍后由于不得不从整个向量中减去1而丢失一点点时间)。然而,如果我使用内部代码,它会运行0.03,这比在绕同一代码封装函数()后快5倍。 – 2011-03-25 15:02:16

1

正如@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