Как сгенерировать следующую последовательность, не прибегая к циклу? - PullRequest
5 голосов
/ 25 марта 2011
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, процедура очень медленная.Есть ли более быстрый способ генерации последовательности без зацикливания?

Спасибо за вашу помощь.

Ответы [ 4 ]

8 голосов
/ 25 марта 2011

Попытка d <- unlist(lapply(time,function(i)seq.int(0,i-1)))

В отношении sidenote одна вещь, которая замедляет все это, это то, что вы выращиваете вектор в цикле.

> 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 

Редактировать: добавлено время для других решений

6 голосов
/ 25 марта 2011

Это намного быстрее, чем цикл, но не так быстро, как решения mapply и lapply, показанные ранее; однако это очень просто:

sequence(time) - 1

и внутри он использует lapply.

3 голосов
/ 25 марта 2011
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 голос
/ 25 марта 2011

Как намекнул @Joris, причина того, что ваше решение работает плохо, была из-за роста вектора.Если вы только догадались по размеру вектора и соответственно распределили память, ваше решение будет работать нормально, но все же не оптимально.

Используя пример @Joris, ваше решение на моей машине заняло 22 секунды.Предварительно выделив большой вектор, мы можем уменьшить его примерно до 0,25 сек

1004 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...