У меня есть вектор 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.
Вот один из способов сделать это ...
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
Здесь есть опция с rle и inverse.rle
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
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
Другой способ с 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.
x
cumsum
values
lengths