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