2016-01-17 1 views
2

Мой вопрос прост, но все же я не смог найти решение в Интернете.Последовательности различной длины в R

У меня есть вектор, например. a = c(7,3,5). Мне нужно преобразовать его в b = c(0,1,2,3,4,5,6,0,1,2,0,1,2,3,4). Я могу сделать это с петлей, но слишком медленно, когда длина (а)> 500000.

m <- 0 
n <- 0 
for (i in 1:length(a)) { 
    m <- n+1; 
    n <- n+a[i]; 

    b[m:n] <- (0:(a[i]-1)); 
} 

Есть один вкладыш в R, который может производить описанное поведение очень быстро? Может ли такой же подход преобразовать вектор a в c = c(0,0,0,0,0,0,1,0,0,1,0,0,0,0,1)?

+3

'x <- последовательность (a) - 1; Икс; as.integer (c (diff (x)! = 1, TRUE)) - одна из возможностей. – Henrik

+2

Для второго вектора вы также можете использовать 'x <- integer (sum (a)); x [cumsum (a)] <- 1L' –

+0

Для первого варианта другой вариант: 'g1 <- rep (seq_along (a), a); ve (seq_along (g1), g1, FUN = seq_along) -1' – akrun

ответ

4

В комментариях есть несколько вариантов, но не один, размещенный в области ответа, поэтому, пока существует охота на , дубликат включен, вот консолидация того, что у нас есть. Первая прямая/логическая альтернатива для каждой опции указана первыми.

## To get your first vector 
sequence(a) - 1            # @Henrik 
ave(1:sum(a), rep(seq_along(a), a), FUN = seq_along) - 1  # @akrun 

## To get your second vector 
tabulate(cumsum(a))           # @alexis_laz 
{ x <- integer(sum(a)) ; x[cumsum(a)] <- 1; x }    # @DavidArenburg 
{ x <- sequence(a) - 1 ; as.integer(c(diff(x) != 1, TRUE)) } # @Henrik 
sequence(a) %/% rep(a, a)         # @GL_Li 

Этот ответ Community Wikied, поэтому не стесняйтесь редактировать и добавлять альтернативы.

+0

для второго вектора, это работает: '' 'sequence (a)% /% rep (a, a)' '' –

 Смежные вопросы

  • Нет связанных вопросов^_^