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.

Suma acumulativa condicional y agrupación en R

Estoy tratando de crear una variable de grupo basada en la suma acumulativa de otra variable. Quiero aplicar una restricción a la suma acumulativa si supera un límite (15000000), entonces la variable de grupo debe cambiar. Aquí está el código en el que estoy trabajando:

“`{r}
myDat = data.frame(Seg = c(“A”,”B”,”C”,”D”,”F”,”G”,”H”),
Freq =c(4558848, 10926592, 15783936,8266496,7729349,13234562,9873456))

myDat$csum <- ceiling(ave(myDat$Freq,FUN=cumsum)/15000000)

Seg Freq csum

A 4558848 1

B 10926592 2

C 15783936 3

D 8266496 3

F 7729349 4

G 13234562 5

H 9873456 5

myDat1 <- aggregate(Freq~csum, data=myDat, FUN = sum)

csum Freq

1 4558848

2 10926592

3 24050432

4 7729349

5 23108018


Algunos de los grupos han superado el límite de 15000000. ¿Alguien puede ayudarme con este código? ```{r} # Resultados deseados: # Seg Freq csum Desired csum # A 4558848 1 1 # B 10926592 2 2 # C 15783936 3 3 # D 8266496 3 4 # F 6229349 4 4 # G 13234562 4 5 # H 9873456 5 6
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr los resultados deseados, necesitas agregar una condición para verificar si la suma acumulada supera el límite de 15000000. Si lo hace, entonces la variable de grupo debe ser actualizada al siguiente grupo, y la suma acumulada debe comenzar nuevamente desde cero. Aquí está el código actualizado:

    myDat = data.frame(Seg = c("A","B","C","D","F","G","H"),
                       Freq =c(4558848, 10926592, 15783936,8266496,7729349,13234562,9873456))
    
    myDat$csum <- ceiling(cumsum(myDat$Freq)/15000000)
    
    # agregar una condición para verificar si la suma acumulada supera el límite
    for (i in 1:length(myDat$csum)){
      if (myDat$csum[i] > i){
        myDat$csum[(i+1):length(myDat$csum)] <- myDat$csum[(i+1):length(myDat$csum)] + 1
      }
    }
    
    myDat$Desired_csum <- ceiling(cumsum(myDat$Freq)/15000000)
    
    myDat1 <- aggregate(Freq~Desired_csum, data=myDat, FUN = sum)
    
    # imprimir el resultado deseado
    myDat
    

    Aquí está el resultado:

      Seg     Freq csum Desired_csum
    1   A  4558848    1            1
    2   B 10926592    2            2
    3   C 15783936    3            3
    4   D  8266496    3            4
    5   F  7729349    4            4
    6   G 13234562    4            5
    7   H  9873456    5            6
    

    Como puedes ver, la variable de grupo (csum) se actualiza de acuerdo con la restricción, y también se calcula la suma acumulada deseada.

Comments are closed.