R - генерировать последовательность чисел

Я пытаюсь создать последовательности из 6 случаев, но с 144 случаями интервалов.

Подобно этому, например

c(1:6, 144:149, 288:293)

1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Как я могу автоматически генерировать такую ​​последовательность с помощью

seq 

или с другой функцией?

Ответ 1

Я считаю, что функция sequence будет полезна в этом случае. Если у вас есть данные в такой структуре:

(info <- data.frame(start=c(1, 144, 288), len=c(6, 6, 6)))
#   start len
# 1     1   6
# 2   144   6
# 3   288   6

тогда вы можете сделать это в одной строке:

sequence(info$len) + rep(info$start-1, info$len)
#  [1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Обратите внимание, что это решение работает, даже если последовательности, которые вы объединяете, имеют разную длину.

Ответ 2

Здесь один подход:

unlist(lapply(c(0L,(1:2)*144L-1L),`+`,seq_len(6)))
# or...
unlist(lapply(c(1L,(1:2)*144L),function(x)seq(x,x+5)))

Здесь мне нравится немного лучше:

rep(c(0L,(1:2)*144L-1L),each=6) + seq_len(6)

Обобщая...

rlen  <- 6L
rgap  <- 144L
rnum  <- 3L

starters <- c(0L,seq_len(rnum-1L)*rgap-1L)

rep(starters, each=rlen) + seq_len(rlen)
# or...
unlist(lapply(starters+1L,function(x)seq(x,x+rlen-1L)))

Ответ 3

Это также можно сделать, используя seq или seq.int

x = c(1, 144, 288)
c(sapply(x, function(y) seq.int(y, length.out = 6)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Так как @Frank, упомянутый в комментариях, здесь является другим способом достижения этой цели с использованием структуры данных @josilber (это особенно полезно, когда существует необходимость в различной длине последовательности для разных интервалов)

c(with(info, mapply(seq.int, start, length.out=len)))

#[1]   1   2   3   4   5   6 144 145 146 147 148 149 288 289 290 291 292 293

Ответ 4

Я использую R 3.3.2. OSX 10.9.4

Я пробовал:

a<-c()  # stores expected sequence
f<-288  # starting number of final sub-sequence
it<-144 # interval
for (d in seq(0,f,by=it))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)

И ожидаемая последовательность хранится в.

[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293

И еще одна попытка:

a<-c()  # stores expected sequence
it<-144 # interval
lo<-4   # number of sub-sequences
for (d in seq(0,by=it, length.out = lo))
{
    if (d==0)
    {
        d=1
    }
    a<-c(a, seq(d,d+5))
    print(d)
}
print(a)

Результат:

[1] 1 2 3 4 5 6 144 145 146 147 148 149 288 289 290 291 292 293 432 433 434 435 436 437