Мы можем использовать rle
в base R
, чтобы создать группу для ave
с помощью rep
, лицензируя последовательность 'значений' с lengths
, созданным с помощью rle
lapply(list1, function(x) ave(x, with(rle(x),
rep(seq_along(values), lengths)), FUN = cumsum))
#$x
#[1] 1 2 -1 -2 1
#$y
#[1] -1 -2 1 -1 -2
Или другой вариант - проверить разницу соседних элементов (для чисел c), а затем выполнить кумулятивную сумму, чтобы создать группу
lapply(list1, function(x) ave(x, cumsum(c(TRUE, diff(x) != 0)) , FUN = cumsum))
Или для общего случая просто удалить первый и последний элементы, сделайте сравнение, чтобы создать группу
lapply(list1, function(x) ave(x, cumsum(c(TRUE, head(x, -1)
!= tail(x, -1))), FUN = cumsum))