Как найти условную сумму в R на основе положительных и отрицательных значений - PullRequest
2 голосов
/ 03 марта 2020

Этот вопрос может быть дубликатом, но он все еще задает!

У меня есть этот список, в котором мне нужно сделать условную сумму по положительным и отрицательным значениям. я мог бы сделать это с таблицей данных, используя это. Но я ищу базовое решение R.

list1 = list(
    x=c(1,1,-1,-1,1),
    y=c(-1,-1,1,-1,-1)
    )

lapply(list1, function(x) ave(x, rleid(x), FUN = cumsum))

$x
[1]  1  2 -1 -2  1

$y
[1] -1 -2  1 -1 -2

1 Ответ

2 голосов
/ 03 марта 2020

Мы можем использовать 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))
...