добавить обратные индексы на основе индикатора - PullRequest
0 голосов
/ 31 августа 2018

У меня есть такой вектор

v <- c(0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0)

Теперь я хочу сгенерировать второй вектор, который считает в обратном направлении, пока не достигнет 1, а затем начнет заново.

Результат здесь будет

r <- c(6,5,4,3,2,1,8,7,6,5,4,3,2,1,4,3,2,1,0)

последний ноль должен быть сохранен

Я пробовал что-то подобное, но не могу заставить его работать:

lv <- c(1, which(v == 1))

res <- c()
for(i in 1:(length(lv)-1)) {
  res <- c(res, rev(lv[i]:lv[i+1]))
}

1 Ответ

0 голосов
/ 31 августа 2018

Мы можем использовать ave для создания групп с cumsum и считать последовательность в reverse в каждой группе. Затем мы присваиваем 1 исходную позицию в new_seq.

new_seq <- ave(v, cumsum(v==1), FUN = function(x) rev(seq_along(x))) + 1
new_seq[v == 1] <- 1

new_seq
#[1] 6 5 4 3 2 1 8 7 6 5 4 3 2 1 4 3 2 1 2

Обновление

Чтобы сохранить все после последней 1 как есть, мы можем сделать

#Make groups
indx <- cumsum(v==1)

#Create reverse sequential counting in each group
new_seq <- ave(v, indx, FUN = function(x) rev(seq_along(x))) + 1

#Keep everything after last 1 as it is
new_seq[which.max(indx) : length(v)] <- v[which.max(indx) : length(v)]

#Change 1's same as their original position
new_seq[v == 1] <- 1

new_seq
#[1] 6 5 4 3 2 1 8 7 6 5 4 3 2 1 4 3 2 1 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...