es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Multiplica la constante por la fila anterior y acumula el resultado en R.

Estoy tratando de calcular una nueva columna en un dataframe que multiplica una constante por el valor de la fila anterior (en la nueva columna B) y acumula el resultado.

Para aclarar, aquí está un ejemplo de mis datos originales:

A

100
200
300
400
500

Aquí está lo que intento lograr:

A B

100 100.00
200 302.00
300 608.04
400 1020.20
500 1540.60

(La constante en este caso es: 0.02)
La fórmula (aproximada) que estoy usando en Excel es algo similar a esto:
=(B1*(1+constante)+A2) [En la celda B2]

He intentado usar lag, mutate y cumsum de dplyr para lograr esto, pero hasta ahora no he tenido suerte. Aquí hay un ejemplo reproducible de lo que he logrado hasta ahora:

rate = .02
A <- c(100,200,300,400,500)

df <- data.frame(A)

df = df %>%
mutate(B = lag(A,default=0)*(1+rate)) %>%
mutate(B = cumsum(B)+df$A)

Esto produce la siguiente salida (diferente a lo que intento obtener):

A B
100 100.00
200 302.00
300 606.00
400 1012.00
500 1520.00

¿Alguien puede ayudarme con un código para calcular esto? ¡Gracias por la ayuda!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, la fórmula para cada fila en la columna B debería ser (constante * valor anterior de B) + valor de A. Aquí está el código para lograr esto usando dplyr:

    # Define la constante y los datos de entrada
    rate <- 0.02
    A <- c(100, 200, 300, 400, 500)
    
    # Crea un dataframe con los valores de A
    df <- data.frame(A)
    
    # Agrega una nueva columna con el valor inicial de A[1] * (1 + constante)
    df$B <- A[1] * (1 + rate)
    
    # Calcula el resto de los valores usando dplyr
    df <- df %>%
      mutate(B = ifelse(is.na(B), A[1] * (1 + rate), B),     # reemplaza NA con el valor inicial
             B = lag(B, default = A[1] * (1 + rate)) * rate + A,    # calcula el nuevo valor de B para cada fila
             B = cumsum(B))                                 # acumula los valores de B
    
    # Muestra el resultado
    df
    

    Esto debería producir el siguiente resultado:

         A        B
    1  100  100.000
    2  200  302.000
    3  300  608.040
    4  400 1020.202
    5  500 1540.611
    

    Ten en cuenta que agregué una declaración ifelse para reemplazar el valor NA en la primera fila con el valor inicial de A[1] * (1 + constante). Esto es necesario porque lag devuelve NA para la primera fila.

Comments are closed.