1) При этом используется rleid
из data.table
для создания переменной группировки и базы R для остальных. ave
вычисляет сумму каждой группы и ifelse
NA из 0 групп.
library(data.table)
transform(DF, sum_slope = ave(slope, rleid(term), FUN = sum) * ifelse(term, 1, NA))
дает:
slope term sum_slope
1 0.50 1 1.30
2 0.80 1 1.30
3 0.30 0 NA
4 0.25 0 NA
5 0.18 0 NA
6 0.40 0 NA
7 1.20 1 5.47
8 3.60 1 5.47
9 0.67 1 5.47
10 0.30 0 NA
11 0.80 1 0.80
12 0.40 0 NA
2) В этом варианте вышеизложенного используется только базовый R. Он заменяет rleid
базовым выражением cumsum(...)
, которое делает то же самое.
transform(DF, sum_slope =
ave(slope, cumsum(c(FALSE, diff(term) != 0)), FUN = sum) * ifelse(term, 1, NA))
Примечание
Ввод в воспроизводимом виде:
Lines <- "
slope term
0.5 1
0.8 1
0.3 0
0.25 0
0.18 0
0.4 0
1.2 1
3.6 1
0.67 1
0.3 0
0.8 1
0.4 0"
DF <- read.table(text = Lines, header = TRUE)