сумма в повторяющейся последовательности - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть фрейм данных, который выглядит следующим образом:

df <- data.frame((v1=c(4,5,6,1,2,3,4,5,6,1,2,3),v2=c(0,7,3,6,2,6,9,2,4,7,1,4))

Как получить cumsum для v2, если v1 увеличивается, а когда v1 уменьшается (падает с 6 до 1), cumsum должен запустить снова. (Представьте, что последовательность в v1 идет несколько раз от 1 до 6, но может начинаться и заканчиваться на любом количестве последовательности) Результат должен выглядеть следующим образом:

df <- data.frame((v1=c(4,5,6,1,2,3,4,5,6,1,2,3),v2=c(0,7,3,6,2,6,9,2,4,7,1,4), expected=c(0,7,10,6,8,14,23,25,29,7,8,12)

Спасибо за помощь

1 Ответ

1 голос
/ 15 февраля 2020

Мы можем создать группу на основе отношения diff между соседними элементами 'v1', а затем выполнить cumsum

library(dplyr)
df %>%
   group_by(grp = cumsum(c(TRUE, diff(v1) < 0))) %>% 
   mutate(new = cumsum(v2)) %>%
   ungroup %>%
   select(-grp)

Или это можно сделать в base R

df$new <- with(df, ave(v2, cumsum(c(TRUE, diff(v1) < 0)), FUN = cumsum))
df$new
#[1]  0  7 10  6  8 14 23 25 29  7  8 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...