У меня есть такой набор данных
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