Генерировать повторяющуюся последовательность

Мне нужно сгенерировать вектор следующего формата с помощью R:

1:10, 1:10, 11:20, 11:20, ... 121:130, 121:130

Есть ли более простой способ, чем создать 12 векторов, а затем повторить каждый из них дважды?


person dnagirl    schedule 23.06.2010    source источник


Ответы (6)


Это то, что вы хотите?

unlist(lapply(rep(seq(1, 121, by=10), each=2), function(x) seq(x, x+9)))
person Shane    schedule 23.06.2010

Также вы можете сделать:

rep(1:10, 26) + rep(seq(0,120,10), each=20)
person nico    schedule 23.06.2010
comment
элегантный! И, учитывая количество способов добраться до результата, я чувствую себя немного лучше из-за того, что запутался. - person dnagirl; 23.06.2010
comment
крысы, пришел к этому поздно и подумал, что у меня самый быстрый, но это настолько близко к оптимальному решению, что я просто голосую за него. Чтобы сделать это еще быстрее, используйте rep(0:12, each = 20)*10 после знака +. (общее ускорение в 6 раз) - person John; 24.06.2010
comment
в дополнение к проблеме скорости - этот ответ в 5 раз быстрее, чем lapply()). Ответ external() ниже находится между этим ответом и моей модификацией производительности. Более новый матричный ответ примерно равен по скорости моей модификации здесь и, возможно, самый быстрый в целом. - person John; 24.06.2010
comment
И еще одна модификация: 1:10 + rep(10*(0:12), each=20). - person Marek; 25.06.2010

Другой путь:

x <- matrix(1:130, 10, 13)
c(rbind(x, x))

Возможен более эффективный вариант:

x <- 1:130
dim(x) <- c(10,13)
c(rbind(x, x))
person Marek    schedule 23.06.2010

В качестве альтернативы вы можете использовать комбинацию rep и outer, например:

c(outer(1:10,rep(0:12,each=2),function(x,y)10*y+x))
person nullglob    schedule 23.06.2010

Я думаю, это вам подойдет.

x <- ((0:12)*10)+1
y <- x + 9

repeatVectors <- function(x,y){
    rep(seq(x,y),2)
}

z <- mapply(repeatVectors, x,y)
z <- as.vector(z)
person JoFrhwld    schedule 23.06.2010

Метод, использующий split,

unlist(rep(split(seq_len(130), rep(1:13, each=10)), each=2), use.names=FALSE)
person lmo    schedule 05.07.2017