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]))
De acordo com sua atualização, parece que as regras são complicadas, mas elas podem ser simplificadas. Você pode tentar o código abaixo
ou
Adaptando a resposta de ThomasIsCoding da sua pergunta anterior, você pode dividi-la em duas etapas: primeiro, calcule qual deve ser o valor condicional e, então, forneça os valores ao cumprod multiplicados pela condição sig:
Se
nrow(dat)
for bem pequeno, podemos usar umafor
lógica de loop simples (que funciona, mas não é eficiente).