如何在不诉诸循环的情况下生成以下序列?

Ton*_*ony 5 r

time<-c(10,20)
d<-NULL
for ( i in seq(length(time)))
d<-c(d,seq(0,(time[i]-1)))
d
Run Code Online (Sandbox Code Playgroud)

time<-c(3000,4000,2000,...,5000)时间长度为1000时,程序非常慢.是否有更快的方式生成序列而不循环?

谢谢你的帮助.

Jor*_*eys 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 
Run Code Online (Sandbox Code Playgroud)

编辑:为其他解决方案添加时间


G. *_*eck 6

这比环快得多,但并不完全一样快mapplylapply解决方案之前显示; 但是,它很简单:

sequence(time) - 1
Run Code Online (Sandbox Code Playgroud)

在内部它使用了lapply.