Hola,

Crear la suma acumulada, puede hacerse de diferentes formas.
Pero rellenar el hueco del año cuando hay dos filas consecutivas con el
mismo ID pero diferente año, es donde aparece la complejidad.

Esta es una forma de crear la suma acumulada (con sqldf) y de completar ese
hueco.
El hueco se completa, pero siempre que el salto del año sea de uno, como en
el ejemplo de los datos que has incluido.

#------------------------------------------------------
Lines <- "ROW ID      FECHA YEAR CANTIDAD
1 100 2005-08-02 2005        1
2 100 2005-10-19 2005        2
3 100 2007-02-09 2007        1
4 100 2007-10-25 2007        1
5 100 2007-10-29 2007        1
6 120 2006-05-11 2006        1
7 120 2006-08-17 2006        5
8 120 2006-10-15 2006        1
9 120 2007-04-16 2007        3
"

DF <- read.table(textConnection(Lines), header=T, as.is = TRUE)

# Consigo el valor acumulado de CANTIDAD agrupado por YEAR y ID
library(sqldf)
df.tmp <- sqldf("select ID,YEAR, sum(CANTIDAD) as cusum from DF group by
ID,YEAR order by ID,YEAR")

# Ahora completo el hueco en el año
df.new <- 0
for(i in 1:nrow(df.tmp)) {

  if(i>1) {
            if(df.tmp$ID[i]==df.tmp$ID[i-1] &
(df.tmp$YEAR[i]!=df.tmp$YEAR[i-1]) & df.tmp$YEAR[i]-df.tmp$YEAR[i-1] > 1 ){

              #Introduzco la fila anterior que falta
               df.new <- rbind(df.new, c(df.tmp$ID[i] , df.tmp$YEAR[i]-1
,df.tmp$cusum[i]))

              #Introduzco la fila tal cual
               df.new <- rbind(df.new, c(df.tmp$ID[i] , df.tmp$YEAR[i]
,df.tmp$cusum[i]))

            } else {
               df.new <- rbind(df.new, c(df.tmp$ID[i] , df.tmp$YEAR[i]
,df.tmp$cusum[i]))
            }
  } else {
    # i=1 - Copio la fila
   df.new <- rbind(df.new, c(df.tmp$ID[i] , df.tmp$YEAR[i]
,df.tmp$cusum[i]))
  }

}

df.tmp
# Arreglo df.new
df.new <- df.new[2:nrow(df.new),]
row.names(df.new) <- NULL
df.new <- as.data.frame(df.new)
names(df.new) <- names(df.tmp)
df.new


#----------------------------- FIN DE PROGRAMA -------------------------


Saludos,
Carlos Ortega
www.qualityexcellence.es


El 10 de marzo de 2014, 19:19, Francisco Javier
<iterador10@hotmail.com>escribió:

> Hola,
>
> Hola a todos,
> Os escribo porque no consigo finalizar el script necesario para realizar
> lo que a continuación planteo. Partiendo de un data frame (2 millones de
> casos), tengo:
>
> > datos2
>    ID      FECHA YEAR CANTIDAD
> 1 100 2005-08-02 2005        1
> 2 100 2005-10-19 2005        2
> 3 100 2007-02-09 2007        1
> 4 100 2007-10-25 2007        1
> 5 100 2007-10-29 2007        1
> 6 120 2006-05-11 2006        1
> 7 120 2006-08-17 2006        5
> 8 120 2006-10-15 2006        1
> 9 120 2007-04-16 2007        3
>
> Y desearía las cantidades acumuladas por ID y año, a partir del primer año
> con registros de cada ID, obteniendo:
>     ID      YEAR CANTIDAD
> 1 100 2005        3
> 2 100 2006        3  (como en el 2006 no hay datos de ID=100, el acumulado
> se mantiene)
> 3 100 2007        6
> 4 120 2006        7
> 5 120 2007        10
>
> Hasta ahora sólo he conseguido llegar a esto mediante el paquete
> data.table:
> > library(data.table)
> > datos2 <- data.table(datos2)
> > datos2 <- datos2[, ACUM.CANTIDAD:=cumsum(CANTIDAD), by = list(ID, YEAR)]
> > datos2
>     ID      FECHA YEAR CANTIDAD ACUM.CANTIDAD
> 1: 100 2005-08-02 2005        1             1
> 2: 100 2005-10-19 2005        2             3
> 3: 100 2007-02-09 2007        1             1
> 4: 100 2007-10-25 2007        1             2
> 5: 100 2007-10-29 2007        1             3
> 6: 120 2006-05-11 2006        1             1
> 7: 120 2006-08-17 2006        5             6
> 8: 120 2006-10-15 2006        1             7
> 9: 120 2007-04-16 2007        3             3
>
> Cualquier ayuda será bienvenida. Muchísimas gracias.
>
>
>
>         [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>


-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

	[[alternative HTML version deleted]]

