Это было обновлено, чтобы учесть, что первый элемент b равен 1. Спасибо @ tk3 за то, что он указал на необходимость изменения.
Похоже, ваше правило - увеличивать флаг, если b равно нулю ИЛИ, если это первая 1 в последовательности.
Это даст ваш ответ.
cumsum(1 + c(df$b[1],diff(df$b)>0) - df$b)
[1] 1 2 3 4 4 4 5 6 7 8 8
Если вы просто хотите увеличить флаг, когда b равно нулю, вы можете использовать
cumsum(1-df$b)
. За исключением того, что не поменял бы флаг для первого в серии. Поэтому я хотел сделать измененную версию b
, которая установит b = 0 для всех первых. Вы можете использовать c(df$b[1], diff(df$b) >0)
, чтобы получить все места, которые b сменили с нуля на единицу - «первые». Сейчас
df$b - c(df$b[1],diff(df$b)>0)
0 0 0 0 1 1 0 0 0 0 1
заменяет все "первые" на нули , если не является первым элементом b. С этим измененным b мы можем использовать cumsum, как указано выше. Мы хотим взять сумму
1 - (df $ b - c (df $ b [1], diff (df $ b)> 0)) = 1 + c (df $ b [1], diff (df $ b)> 0) - df $ b
Какой был мой ответ
cumsum(1 + c(df$b[1],diff(df$b)>0) - df$b)
[1] 1 2 3 4 4 4 5 6 7 8 8
Оригинальная версия работала только для df $ b [1] = 0. Обновленная версия также должна работать для df $ b [1] = 1.