Условная накопленная сумма в той же строке в R

Prashant Dey спросил: 03 ноября 2018 в 08:23 в: r

У меня есть такой набор данных

dat <- data.frame(Col0 =rep(c("grp1","grp2","grp3", "grp4"), each = 4),
              Col1 = rep(c("B","S","S","B"), 4),
              Col2 = rep(c(1,2,3,4), 4),
              Col3 = rep(c(0.1,0.2,0.3,0.4), 4))

Я пытаюсь создать четвертый столбец, как показано ниже

dat1 <- data.frame(Col0 =rep(c("grp1","grp2","grp3", "grp4"), each = 4),
               Col1 = rep(c("B","S","S","B"), 4),
               Col2 = rep(c(1,2,3,4), 4),
               Col3 = rep(c(0.1,0.2,0.3,0.4), 4),
               Col4 = c(1, 0.8, 1.26, 4, 1, 0.8, 1.26, 4, 1, 0.8, 1.26, 4))

Что Я пробовал до сих пор,

d1 <- dat %>% 
  group_by(Col0) %>% 
  mutate(Col4 = if_else(Col1 == 'B', Col2,
                        if_else(Col1 == 'S' & lag(Col1 == "B"), lag(Col2)- Col3*lag(Col2), 0)))
d1

Ответ, который я получаю, не тот, что в Col4, что является желательным. Условие для получения Col4:

 if Col1 is B then get the value of Col2 as it is, if Col1 is S & Previous Value of Col1 is B then 1-(0.2*1) which is equal to 0.8
 if Col1 is S & Previous Value of Col1 is S as well then (1+0.8) -((1+0.8)*0.3) which is 1.26

По сути, это похоже на то, как сначала выполнить разницу, а затем выполнить кумулятивную сумму, включая разницу и т. д.

Сейчас я взял простой пример, чтобы понять, что я пытаюсь чтобы достичь, фактический набор данных имеет более 1 миллиона Obs. и несколько тысяч групп, и что еще хуже, это сочетание "B" & 'S' изменить. Как и в некоторых группах, это B,B,S,S и т. Д.

Любая справка по этому вопросу будет оценена, поскольку я пробовал несколько вещей, кроме if_else(), и видел много условная кумулятивная сумма Ques, но безрезультатно.

Я думаю, что то же самое можно легко сделать в Excel с помощью функции SUMIF (), но мне нужно сделать это с помощью R

0 ответов