[R-es] Acumulado hasta una fecha exacta según individuo

Carlos J. Gil Bellosta cgb en datanalytics.com
Dom Abr 27 01:07:15 CEST 2014


Hola, ¿qué tal?

Si usas data.table, puedes hacer así:

require(data.table)
datos2 <- data.table(data.frame(ID = c(rep(100,3),rep(120,2)),
                                FECHA = as.Date(c("02/08/2005",
"19/10/2005", "09/12/2007",
                                                  "11/05/2006",
"20/12/2009"),"%d/%m/%Y"),
                                ENTRADA =
c(as.Date(rep("30/07/2007",3),"%d/%m/%Y"),

as.Date(rep("25/02/2008",2),"%d/%m/%Y")),
                                CANTIDAD = c(25, 15, 12, 35, 2)))


setkey(datos2, ID)

datos2 <- datos2[, entrada := unique(ENTRADA), by = ID]
datos2 <- datos2[FECHA < entrada,]
res <- datos2[, list(total = sum(CANTIDAD)), by = ID]

La clave está en el operador := , que hace exactamente lo que parece
en el ejemplo anterior.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



El día 27 de abril de 2014, 0:52, Francisco Javier
<iterador10 en hotmail.com> escribió:
> Buenas noches a todos las personas del foro,
>
>
>
> Me dirijo a vosotros con la siguiente cuestión:
>
> ¿Cómo es posible obtener, para cada individuo (identificado con la variable ID) de un data frame, la CANTIDAD ACUMULADA hasta una determinada fecha (día, mes y año), que es diferente para cada individuo y que se denota por la variable ENTRADA?
>
> Ejemplo:
>
> require(data.table)
> datos2 <- data.table(data.frame(ID = c(rep(100,3),rep(120,2)),
>           FECHA = as.Date(c("02/08/2005", "19/10/2005", "09/12/2007",
>           "11/05/2006", "20/12/2009"),"%d/%m/%Y"),
>           ENTRADA = c(as.Date(rep("30/07/2007",3),"%d/%m/%Y"),
>                         as.Date(rep("25/02/2008",2),"%d/%m/%Y")),
>           CANTIDAD = c(25, 15, 12, 35, 2)))
>
>     ID      FECHA    ENTRADA CANTIDAD
> 1: 100 2005-08-02 2007-07-30       25
> 2: 100 2005-10-19 2007-07-30       15
> 3: 100 2007-12-09 2007-07-30       12
> 4: 120 2006-05-11 2008-02-25       35
> 5: 120 2009-12-20 2008-02-25        2
>
> Desearía obtener, dentro de cada ID, la cantidad acumulada hasta un instante igual a su fecha ENTRADA:
>     ID    ENTRADA CANT_ACUM
> 1: 100 2007-07-30        40
> 2: 120 2008-02-25        35
>
> Sin embrago, ejecuto el siguiente código y no compila:
>
> require(reshape2)
> res=melt(dcast.data.table(datos2,ID~ENTRADA,sum,value.var="CANTIDAD"),
>     id.var="ID")
> setkey(res,ID,variable)
> result <- subset(res[,CANT_ACUM:=cumsum(value<=ENTRADA),by=ID],CANT_ACUM>0)
> result <- as.data.frame.matrix(result) # Convierto en data frame
> result <- result[,-which(colnames(result)=='value')]
>
> Muchas gracias por cualquier ayuda.
>
>         [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



Más información sobre la lista de distribución R-help-es