rvaquerizo en analisisydecision.es
2014-Mar-12 11:58 UTC
[R-es] Frecuencia absoluta acumulada por individuo y por
Por si tienes especial interés en utilizar sqldf: todos <- sqldf( "select distinct a.ID,b.YEAR from dt a , dt b;") suma <- sqldf( "select ID,YEAR,sum(CANTIDAD) as CANTIDAD from dt group by ID,YEAR;") todos <- sqldf( "select a.ID,a.YEAR, CANTIDAD from todos a left join suma b on a.ID = b.ID and a.YEAR = b.YEAR group by a.ID,a.YEAR;") todos$CANTIDAD = ifelse(is.na(todos$CANTIDAD),0,todos$CANTIDAD) todos$ACUM = cumsum(todos$CANTIDAD) La suma acumulada también la podemos hacer con sqldf, pero nos metemos en un fregado considerable. Por cierto, mira que es cabezota sqldf con los valores nulos... Saludos. Raúl Vaquerizo Romero www.analisisydecision.es
Carlos Ortega
2014-Mar-12 14:56 UTC
[R-es] Frecuencia absoluta acumulada por individuo y por
Hola, También es muy buena la solución. Acabo de caer en la cuenta de que tu solución como la de Olivier no contempla el caso de que haya un salto para un determinado (o vaya para varios) IDs de varios años. En ese caso, tienes que crear los años faltantes para poder luego rellenar el acumulado. Puedes a partir del primer "todos" reconstruirlo sin "sqldf" y luego seguir con la solución que has propuesto... Un ejemplo de ese conjunto sería este: 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 *2010* 3 Saludos, Carlos Ortega www.qualityexcellence.es 2014-03-12 12:58 GMT+01:00 <rvaquerizo@analisisydecision.es>:> Por si tienes especial interés en utilizar sqldf: > > todos <- sqldf( > "select distinct a.ID,b.YEAR > from dt a , dt b;") > > suma <- sqldf( > "select ID,YEAR,sum(CANTIDAD) as CANTIDAD > from dt > group by ID,YEAR;") > > todos <- sqldf( > "select a.ID,a.YEAR, CANTIDAD > from todos a left join suma b > on a.ID = b.ID and a.YEAR = b.YEAR > group by a.ID,a.YEAR;") > > todos$CANTIDAD = ifelse(is.na(todos$CANTIDAD),0,todos$CANTIDAD) > todos$ACUM = cumsum(todos$CANTIDAD) > > La suma acumulada también la podemos hacer con sqldf, pero nos metemos en > un fregado considerable. Por cierto, mira que es cabezota sqldf con los > valores nulos... Saludos. > > > Raúl Vaquerizo Romero > www.analisisydecision.es > > _______________________________________________ > 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]]
"Olivier Nuñez"
2014-Mar-12 16:56 UTC
[R-es] Frecuencia absoluta acumulada por individuo y por
Se supone que todos los años del periodo considerado están en la base de datos. Dudo que no sea el caso (tiene según Francisco, 2 millones casos!). Por otro lado, me parece que la variante que propuso Raul no da el resultado buscado al no acumular la variable CANTIDAD por ID (ultima linea). Un saludo. Olivier -- Olivier Nuñez Cancer Epidemiology Unit National Center of Epidemiology (Pab, 12) Instituto de Salud Carlos III Monforte de Lemos 5 28029 Madrid Phone: +(34) 91 822 2859 Fax: +(34) 91 387 7815 e-mail: onunez en isciii.es> Hola, > > También es muy buena la solución. > > Acabo de caer en la cuenta de que tu solución como la de Olivier no > contempla el caso de que haya un salto para un determinado (o vaya para > varios) IDs de varios años. > En ese caso, tienes que crear los años faltantes para poder luego rellenar > el acumulado. Puedes a partir del primer "todos" reconstruirlo sin "sqldf" > y luego seguir con la solución que has propuesto... > > Un ejemplo de ese conjunto sería este: > > 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 *2010* 3 > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > > > > 2014-03-12 12:58 GMT+01:00 <rvaquerizo en analisisydecision.es>: > >> Por si tienes especial interés en utilizar sqldf: >> >> todos <- sqldf( >> "select distinct a.ID,b.YEAR >> from dt a , dt b;") >> >> suma <- sqldf( >> "select ID,YEAR,sum(CANTIDAD) as CANTIDAD >> from dt >> group by ID,YEAR;") >> >> todos <- sqldf( >> "select a.ID,a.YEAR, CANTIDAD >> from todos a left join suma b >> on a.ID = b.ID and a.YEAR = b.YEAR >> group by a.ID,a.YEAR;") >> >> todos$CANTIDAD = ifelse(is.na(todos$CANTIDAD),0,todos$CANTIDAD) >> todos$ACUM = cumsum(todos$CANTIDAD) >> >> La suma acumulada también la podemos hacer con sqldf, pero nos metemos en >> un fregado considerable. Por cierto, mira que es cabezota sqldf con los >> valores nulos... Saludos. >> >> >> Raúl Vaquerizo Romero >> www.analisisydecision.es >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es > > [[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 >-- ____________________________________ Olivier G. Nuñez Email: onunez en unex.es http://kolmogorov.unex.es/~onunez Tel : +34 663 03 69 09 Departamento de Matemáticas Universidad de Extremadura