[R-es] aplicar función de cuantilas a un dataframe

morales en us.es morales en us.es
Mie Mar 17 11:09:50 CET 2010


Hola Javier, muchisimas gracias!!  Funciona perfectamente tanto la función "by" como la función para convertirla en un data frame.

Saludos, 

M. Morales

----- Mensaje original -----
De: Javier Muñoz <javimunozlara en gmail.com>
Fecha: Miércoles, Marzo 17, 2010 9:43 ombr
Asunto:  Re: [R-es] aplicar función de cuantilas a un dataframe
A: morales en us.es
CC: Jorge Ivan Velez <jorgeivanvelez en gmail.com>, r-help-es en r-project.org


> Hola Manuel.
> 
> Puedes usar la función 'by' en lugar de 'aggregate'. Si necesitas que 
> el
> output sea un data.frame siempre puedes transformar el objeto de clase 
> 'by'.
> Por ejemplo, con esta función:
> 
> m.aggregate <-
> function(data, INDICES, FUN, ...){
>   mby <- by(data, INDICES, FUN, ...) #unas lista de dimensiones 'ni' x 
> 'nj'
> x ... x 'k'
>   if(all(sapply(mby, length) < 2))
>     stop("Use 'aggregate' for scalar FUN\n")
>   x <- expand.grid(dimnames(mby), KEEP.OUT.ATTRS = FALSE)
>   x <- x[!sapply(mby, is.null), ]
>   y <- do.call("rbind", mby)
>   x <- cbind(x, y)
>   as.data.frame(x)
> }
> 
> Los argumentos son los mismos que los de 'by'.
> 
> En general, para este tipo de tareas también conviente tener presente 
> el
> paquete 'plyr'.
> 
> Un saludo.
> 
> Javier.
> 
> 
> 
> El 17 de marzo de 2010 08:50, <morales en us.es> escribió:
> 
> >
> > Hola, perdón por el error en el fichero que os dejé. Ya lo he 
> arreglado y
> > os lo adjunto de nuevo con el valor  "LOW" corregido.  Sigo teniendo 
> el
> > problema de obtener varias cuantilas para cada variable 
> estratificada. Solo
> > puedo conseguir una cuantila de la siguiente forma:
> >
> >
> >
> > > percen2 = function(x) {
> > + quantile(x,probs = c(.10))
> > + }
> > > percen2(example$recall)
> > 10%
> >  18
> > > aggregate(example$recall, list(example$EDUCATION,example$Age),percen2)
> >  Group.1 Group.2    x
> > 1    High      45 23.0
> > 2     LOW      45 16.5
> > 3    High      85 27.2
> > 4     LOW      85 18.0
> > >
> >
> > Sin embargo, me gustaría conseguir juntos varios valores de cuantilas.
> > Alguna sugerencia?
> >
> > Saludos,
> >
> > M. Morales
> >
> >
> >
> >
> >
> >
> >
> > ----- Mensaje original -----
> > De: Jorge Ivan Velez <jorgeivanvelez en gmail.com>
> > Fecha: Martes, Marzo 16, 2010 11:28 pm
> > Asunto:  Re: [R-es] aplicar función de cuantilas a un dataframe
> > A: morales en us.es
> > CC: r-help-es en r-project.org
> >
> >
> > > Buenas tardes Manuel,
> > >
> > > Muchas gracias por el ejemplo!
> > >
> > > Lo que esta ocurriendo es que en una de las combinaciones 
> EDUCATION -
> > > Age no
> > > tienes observaciones, por lo que no es posible calcular los cuantiles
> > > de
> > > recall en ese nivel. Por lo tanto obtienes:
> > >
> > > # lo que quieres calcular
> > > with(example, aggregate(recall, list(EDUCATION, Age), quantile))
> > > # Error in aggregate.data.frame(as.data.frame(x), ...) :
> > > #  'FUN' must always return a scalar
> > >
> > > De la siguiente manera puedes calcular el numero de observaciones 
> por
> > > combinacion que menciono anteriormente:
> > >
> > > # numero de observaciones en cada combinacion
> > > with(example, table(EDUCATION, Age))
> > > #         Age
> > > # EDUCATION 45 85
> > > #     High  5  3
> > > #     Low   1  0
> > > #     LOW   4  4
> > >
> > > Cual es la diferencia entre "Low" y "LOW"?   Mi sugerencia seria
> > > unificar el
> > > nivel educativo a uno de los dos y luego ejecutar nuevamente el analisis.
> > >
> > > Espero sea de utilidad,
> > >
> > >                              Jorge Ivan Velez
> > >
> > >
> > > 2010/3/16 <>
> > >
> > > > Hola R-adictos,
> > > >
> > > > me gustaría que alguien me ayudara a aplicar la función "quantile"
> > (varios
> > > > percentiles) a un marco de datos estratificado por algunas variables
> > > > categóricas (ver fichero adjunto como ejemplo). La idea es obtener
> > varios
> > > > percentiles de varias variables (primeras columnas del fichero de
> > datos),
> > > > pero dividiendo el marco de datos en función de los valores de las
> > variables
> > > > categóricas (educación y edad, las dos últimas columnas del fichero
> > > de
> > > > datos).
> > > >
> > > > Lo he intentado con aggregate y este es el resultado:
> > > >
> > > > example= read.table("example.txt",header=T)
> > > > aggregate(example$recall, list(example$EDUCATION,example$Age), mean)
> > > > aggregate(example$recall, list(example$EDUCATION,example$Age),
> > quantile)
> > > >
> > > > > aggregate(example$recall, list(example$EDUCATION,example$Age),
> > quantile)
> > > > Error en aggregate.data.frame(as.data.frame(x), ...) :
> > > >  'FUN' must always return a scalar
> > > >
> > > > Tambien he intentado crear una función para aplicarla, pero este 
> ha
> > > sido el
> > > > resultado:
> > > >
> > > > percen = function(x) {
> > > > quantile(x,probs = c(.05,.10,.20,.5,.6,.8,.95))
> > > > }
> > > > percen(example$recall)
> > > > aggregate(example$recall, list(example$EDUCATION,example$Age), percen)
> > > >
> > > > > aggregate(example$recall, list(example$EDUCATION,example$Age),
> > percen)
> > > > Error en aggregate.data.frame(as.data.frame(x), ...) :
> > > >  'FUN' must always return a scalar
> > > >
> > > >
> > > > Alguna sugerencia? Gracias anticipadas
> > > >
> > > > Manuel
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > _______________________________________________
> > > > R-help-es mailing list
> > > > R-help-es en r-project.org
> > > >
> > > >
> > > >
> >
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es en r-project.org
> > 
> >
> >



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