Abaixo está um exemplo reproduzível com um dataframe de teste:
dat<- structure(list(A = c(1.3, 1.5, 1.6, 1.2, 1.1, 1.2),
B = c(0.25, 0.21, 0.21, 0.15, 0.26, 0.17),
sig = c(1, 0, 1, 1, 1, 1 ),
coef = c(1.25, 2.5, 3.3, 1.8, 2.25, 4.5)),
class = c("tbl_df", "tbl", "data.frame"),
row.names = c(NA, -6L))
Quero criar uma nova coluna mv
onde mutate
a fórmula aplicada depende da condição em outra coluna. Além disso, isso tem que ser recursivo, então preciso do anterior como entrada. Também preciso definir um valor inicial inicial.
Por exemplo, se o valor na coluna A for superior ou igual a 1,2 e sig for igual a 1; mv = ((1 - Coluna B) * 1000)) +(Coluna B * 1000 * coef). Mas isso é apenas para a primeira linha. Para o resto, em vez de 1000 (valor inicial), deve ser o valor anterior. Se o valor na coluna A for superior ou igual a 1,2 e sig for igual a 0, então mv = valor anterior - (valor anterior * Coluna B. Se o valor da coluna A for inferior a 1,2, então tome o valor anterior inalterado.
A saída desejada é:
UM | B | assinatura | coef | meu v |
---|---|---|---|---|
1.3 | 0,25 | 1 | 1,25 | 1062,5 |
1.5 | 0,21 | 0 | 2,5 | 839,4 |
1.6 | 0,21 | 1 | 3.3 | 1244,79 |
1.2 | 0,15 | 1 | 1.8 | 1394,17 |
1.1 | 0,26 | 1 | 2,25 | 1394,17 |
1.2 | 0,17 | 1 | 4.5 | 2223,70 |
Tentei usar, case_when
mas os resultados não são bons e estou travado.
dat<-dat %>%
mutate(mv = case_when(
sig==1 ~ accumulate(
B *(A>=1.2) * coef, .f = ~ .x * (1 + .y), .init = 1000)[-1],
sig== 0 ~ accumulate(
B *(A>=1.2), .f = ~ .x - (1 * .y), .init = 1000)[-1]))