увеличить непоследовательные на единицу в векторе - PullRequest
2 голосов
/ 05 октября 2019

У меня есть вектор 1 и 0. Я хотел бы заменить 1 с его «пятно» в векторе.

Например, я хотел бы изменить

 x = c(1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1)

на

1 1 1 0 2 2 2 0 0 3 0 4

Могут меняться числа от 1 до 0.

Ответы [ 3 ]

2 голосов
/ 05 октября 2019

Вот один из способов сделать это ...

x = c(1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1)

x[x==1] <- cumsum(c(x[1], diff(x)) == 1)[x==1]

x
 [1] 1 1 1 0 2 2 2 0 0 3 0 4
0 голосов
/ 05 октября 2019

Здесь есть опция с rle и inverse.rle

inverse.rle(within.list(rle(x), values[values==1] <- seq_along(values[values==1])))
#[1] 1 1 1 0 2 2 2 0 0 3 0 4

Или опция с использованием rleid из data.table

library(data.table)
x1 <- rleid(x)
x1[x!= 0] <- rleid(x1[x!=0])
x1 * x
#[1] 1 1 1 0 2 2 2 0 0 3 0 4
0 голосов
/ 05 октября 2019

Другой способ с rle

x * with(rle(x), rep(cumsum(values), lengths))
#[1] 1 1 1 0 2 2 2 0 0 3 0 4

Мы создаем последовательность длин серий x и повторяем cumsum values lengths времени и умножаем на x так0 остаются как 0, а меняются только 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...