Вот один из способов:
t <- data.frame(v1=c(1,2,1,4,6,7,8,2,3,4,8,1,2), v2=c(2,3,6,1,-3,-2,1,2,-3,6,7,-2,1))
unname(with(t, tapply(v1[v2>0], cumsum(abs(diff(sign(c(0,v2)))))[v2>0], sum)))
[1] 8 10 12 2
Сначала это может показаться немного сложным :)
cumsum(abs(diff(sign(c(0,v2)))))
генерирует уникальный идентификатор группы для каждого прогона положительных или отрицательных значений. Использование diff
и cumsum
для этого является "распространенным" трюком, о котором полезно знать ... Загвоздка в том, что diff
создает более короткий вектор - поэтому используется c(0, v2)
.