Условная накопленная сумма в той же строке в R - PullRequest
0 голосов
/ 27 ноября 2018

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

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(), и видел много условных кумулятивных сумм заданий, но также нет.безрезультатно.

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

1 Ответ

0 голосов
/ 27 ноября 2018

Такое ощущение, что вы не завершили if_else:

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))
d1 <- dat %>% 
   group_by(Col0) %>% 
   mutate(Col4 = if_else(Col1 == 'B', Col2,
                    if_else(Col1 == 'S' & lag(Col1) == "B", 1-(0.2*1),
                            if_else(Col1 == 'S' & lag(Col1) == 'S',1.26,0))))
d1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...