2011-03-25 54 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