R - Подсчет через вектор и обновление на определенное значение? - PullRequest
2 голосов
/ 16 апреля 2020

Допустим, у меня есть вектор

vec <- c(3,0,1,1,0,3,0,1,3,0,0,0,3)

И я хочу иметь возможность считать через этот вектор, используя значение 3 в качестве точки рефрама sh. Итак, я хочу получить вывод

       vec   out
 [1,]    3    1
 [2,]    0    2
 [3,]    1    3
 [4,]    1    4
 [5,]    0    5
 [6,]    3    1
 [7,]    0    2
 [8,]    1    3
 [9,]    3    1
[10,]    0    2
[11,]    0    3
[12,]    0    4
[13,]    3    1

Как бы я сделал это в R, желательно без использования циклов?

Ответы [ 3 ]

4 голосов
/ 16 апреля 2020

С base R вы можете сделать:

ave(vec, cumsum(vec == 3), FUN = seq_along)

 [1] 1 2 3 4 5 1 2 3 1 2 3 4 1
2 голосов
/ 16 апреля 2020

Опция, использующая data.table::rowid:

data.table::rowid(cumsum(vec==3L))
1 голос
/ 16 апреля 2020

Как еще одна идея, мы можем найти индексы последнего значения 3 для каждого элемента vec:

last3 = cummax((vec == 3) * seq_along(vec))
last3
# [1]  1  1  1  1  1  6  6  6  9  9  9  9 13

и вычесть их соответствующие индексы в vec:

seq_along(vec) - last3 + 1   ## `.. - pmax(last3, 1) ..` if `vec[1] != 3`
# [1] 1 2 3 4 5 1 2 3 1 2 3 4 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...