Francisco Javier
2014-Apr-26 22:52 UTC
[R-es] Acumulado hasta una fecha exacta según individuo
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]]
Carlos J. Gil Bellosta
2014-Apr-26 23:07 UTC
[R-es] Acumulado hasta una fecha exacta según individuo
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
>
Igor Sosa Mayor
2014-Apr-27 07:46 UTC
[R-es] Acumulado hasta una fecha exacta según individuo
"Carlos J. Gil Bellosta " <cgb en datanalytics.com> writes:> La clave está en el operador := , que hace exactamente lo que parece! > en el ejemplo anterior.aha... interesante, no conocía ese operador... gracias! -- :: Igor Sosa Mayor :: joseleopoldo1792 en gmail.com :: :: GnuPG: 0x1C1E2890 :: http://www.gnupg.org/ :: :: jabberid: rogorido :: ::
Francisco Javier
2014-Apr-27 22:53 UTC
[R-es] Acumulado hasta una fecha exacta según individuo
En primer lugar, muchas gracias a Carlos J. Gil Bellosta, tanto por la rapidez
como por la precisión de su respuesta. El código que planteas es exactamente lo
que preguntaba.
La única duda que me queda es si el data.table final que queda, sólo puede
recoger cantidades totales que no sean nulas. A modo de ejemplo, supongamos que
los datos contuvieran, para el sijeto ID=100, una variable "ENTRADA"
que fuese ANTERIOR A TODAS LAS VARIABLES "FECHA" DEL SUJETO:
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/2004",3),"%d/%m/%Y"),
as.Date(rep("25/02/2008",2),"%d/%m/%Y")),
CANTIDAD = c(25, 15, 12, 35, 2)))
En ese caso, sería de esperar un resultado del tipo:
> res
ID total
1: 100 0 # SE REMARCA QUE NO HAY TOTAL ACUMULADO PARA ID=100
2: 120 35
Y el resultado del código omite directamente el total acumulado del sujeto
ID=100:
> res
ID total
1: 120 35
En cualquier caso, muchas gracias.
[[alternative HTML version deleted]]
Possibly Parallel Threads
- Acumulado hasta una fecha exacta según individuo
- Frecuencia absoluta acumulada por individuo y por año
- Frecuencia absoluta acumulada por individuo y por año
- Frecuencia absoluta acumulada por individuo y por año
- Frecuencia absoluta acumulada por individuo y por