Я не уверен, что это то, что вам нужно, но подумал, что это может быть полезно.
Во-первых, как упоминалось @akrun, TRUE
и FALSE
являются логическими векторами и не нуждаются быть заключенным в кавычки как строки. Для этого примера я преобразовал их в логические значения.
В этом решении используется tidyverse
. Вы можете перевернуть значения Flag1
в предыдущих или последующих строках, как описано выше, используя lead
и lag
. Используя slice
, вы можете начать свои суммы, начиная с первого TRUE
в Flag1
. Используя cumsum
, вы можете нумеровать ваши группы, которые всегда заканчиваются на Flag2
, являющимся TRUE
.
nf<-c(10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250)
Flag1 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE',
'FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE')
Flag2 <- c('FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE',
'FALSE','FALSE','FALSE','TRUE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','FALSE','TRUE')
Flag1 <- Flag1 == 'TRUE'
Flag2 <- Flag2 == 'TRUE'
abc <- data.frame(Flag1,Flag2,nf)
library(tidyverse)
abc %>%
mutate(Flag1 = if_else(lag(Flag2), TRUE, Flag1),
Flag1 = if_else(lead(Flag2), FALSE, Flag1)) %>%
slice(match(TRUE, Flag1):n()) %>%
group_by(grp = cumsum(lag(Flag2, default = 0))) %>%
summarise(sum = sum(nf))
# A tibble: 3 x 2
grp sum
<dbl> <dbl>
1 0 300
2 1 910
3 2 1890