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

morales en us.es morales en us.es
Vie Mar 19 07:39:20 CET 2010


Carlos, gracias por responder a mi cuestión. Tu procedimiento es bastante "amigable" para aquellos que nos estamos introduciendo en R.  Os agradezco a los tres  vuestras respuestas. En total tenía que hacer 30 tablas. Si no hubiera conocido a R y no me hubiérais ofrecido una solución no se cuanto tiempo habría estado tecleando datos. Siguiendo vuestras sugerencias y luego pasando los resultados a odfWeave (todavía no me atrevo con LATEX) las tablas son muy fáciles de hacer.

Gracias de nuevo.

M. Morales






----- Mensaje original -----
De: "Carlos J. Gil Bellosta " <cgb en datanalytics.com>
Fecha: Miércoles, Marzo 17, 2010 6:50 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


> Hola, ¿qué tal?
> 
> Respondo tarde y para darle gran lanzada alternativa al moro muerto:
> 
> library( doBy )
> summaryBy( recall ~ EDUCATION + Age, data = example, FUN = function( x
> ) quantile( x, c( 0.25, 0.75 )) )
> 
> Siempre he buscado algún tipo de solución en R lo más próxima posible
> al habitual
> 
> select x1, x2, f( y1, y2) as colb1, g(y2 + y3, y4) as colb2, ...
> from mi.tabla
> group by x1, x2
> 
> de SQL que permita:
> 
> 1) Realizar las llamadas a los parámetros y1,... (columnas de la tabla
> original) de una manera simple (sin "decoraciones", etc.).
> 2) Poder utilizar una función distinta/arbitraria por columna.
> 
> Hummmm... ¿alguna idea?
> 
> Un saludo,
> 
> Carlos J. Gil Bellosta
> 
> 
> El día 17 de marzo de 2010 17:49,  <morales en us.es> escribió:
> > Muchas gracias Jorge. Tanto tu procedimiento como el de Javier me valen.
> >
> > Saludos cordiales,
> >
> > M. Morales
> >
> >
> > ----- Mensaje original -----
> > De: Jorge Ivan Velez <jorgeivanvelez en gmail.com>
> > Fecha: Miércoles, Marzo 17, 2010 3:53 pm
> > Asunto:  Re: Re: [R-es] aplicar función de cuantilas a un dataframe
> > A: morales en us.es
> > CC: r-help-es en r-project.org
> >
> >
> >> Buenos dias Manuel,
> >>
> >> Podrias utilizar lo siguiente:
> >>
> >> # funcion percentiles
> >> percen <- function(x) quantile(x, probs = c(.05,.10,.20,.5,.6,.8,.95))
> >>
> >> as.data.frame(with(example, tapply(recall, list(EDUCATION, Age), percen)))
> >> #                                                            45
> >>                           85
> >> # High 23.0, 23.0, 23.0, 23.0, 24.6, 27.0, 27.0 23.3, 24.6, 27.2, 35.0,
> >> 36.2, 38.6, 40.4
> >> # LOW  13.8, 15.6, 19.2, 21.0, 27.4, 37.0, 37.0 18.0, 18.0, 18.0, 19.5,
> >> 20.4, 21.8, 22.7
> >>
> >> Saludos,
> >>       Jorge Ivan Velez
> >>
> >>
> >> 2010/3/17 <>
> >>
> >> >
> >> > 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