Buenos dias! Os escribo para ver si me podeis ayudar con un asunto en el que me he quedado un poco encallado. Lo que tengo que hacer es sacar los percentiles (0.001, 0.005, 0.95 y 0.999) de varias distribuciones beta, concretamente 418. Cada distribucion esta definida por los parametros "shape1" y "shape2". Por lo tanto tengo una base de datos de 418 filas y en cada una de ellas los parametros que me definen la distribucion beta, shape1 y shape2. Tengo el siguiente codigo: distrname="beta" shape1= 0.2 #ejemplo shape2= 0.3 #ejemplo quantvector=c(0.001,0.005,0.95,0.999) (paste("qvector=q",distrname,"(quantvector, shape1, shape2)",sep="")) eval(parse(text= paste("qvector=q",distrname,"(quantvector, shape1, shape2)",sep="") )) qvector Donde tengo problemas es en aplicar el anterior codigo para cada una de las filas de mi base de datos, especificando que shape1 es "mydata$shape1" y shape2 es "mydata$shape2". He pensado que quizas podria hacer una funcion con el anterior codigo y hacer un loop posterior para que me la aplique para cada una de mis filas. Sin embargo estoy convencido de que tiene que haber una manera mas directa utilizando la funcion "apply" de R o alguna de sus "hermanas", que funcionaria mejor. Me podriais ayudar? cualquier pista me seria de gran utilidad. Muchas gracias!! Javi P.D. si necesitais cualquier otra info o un ejemplo de los datos, no dudeis en pedirmelo. [[alternative HTML version deleted]]
Hola, Efectivamente la función "apply" te ayudaría mucho en este caso, y no hace falta que pases por crear la función y evaluarla como haces. Sería algo así. quantvector=c(0.001,0.005,0.95,0.999) res_ults <- apply(tu_dataframe, 1, qbeta, p=quantvector, shape1 tu_dataframe$shape1, shape2 = tu_dataframe$shape2) El "1" de apply está indicando el MARGIN sobre el que ha de actuar de tu dataframe, en este caso las filas. Entiendo que tu dataframe tienbe una columna que es el "shape1" y otra el "shape2". Saludos, Carlos Ortega www.qualityexcellence.es El 12 de julio de 2018, 11:44, javier bueno enciso <jbuenoenciso en hotmail.com> escribió:> Buenos dias! > > > Os escribo para ver si me podeis ayudar con un asunto en el que me he > quedado un poco encallado. > > > Lo que tengo que hacer es sacar los percentiles (0.001, 0.005, 0.95 y > 0.999) de varias distribuciones beta, concretamente 418. Cada distribucion > esta definida por los parametros "shape1" y "shape2". Por lo tanto tengo > una base de datos de 418 filas y en cada una de ellas los parametros que me > definen la distribucion beta, shape1 y shape2. > > > Tengo el siguiente codigo: > > > distrname="beta" > shape1= 0.2 #ejemplo > shape2= 0.3 #ejemplo > quantvector=c(0.001,0.005,0.95,0.999) > (paste("qvector=q",distrname,"(quantvector, shape1, shape2)",sep="")) > eval(parse(text= paste("qvector=q",distrname,"(quantvector, shape1, > shape2)",sep="") )) > qvector > > Donde tengo problemas es en aplicar el anterior codigo para cada una de > las filas de mi base de datos, especificando que shape1 es "mydata$shape1" > y shape2 es "mydata$shape2". He pensado que quizas podria hacer una funcion > con el anterior codigo y hacer un loop posterior para que me la aplique > para cada una de mis filas. > > Sin embargo estoy convencido de que tiene que haber una manera mas directa > utilizando la funcion "apply" de R o alguna de sus "hermanas", que > funcionaria mejor. > > Me podriais ayudar? cualquier pista me seria de gran utilidad. > > Muchas gracias!! > > Javi > > P.D. si necesitais cualquier otra info o un ejemplo de los datos, no > dudeis en pedirmelo. > > > > > > [[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 >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Muchas gracias Carlos, Sin embargo lo que me crea es una matriz de 174724 elementos (148x 148). Lo que yo quiero en el output es una matriz de 1672 elementos (los cuatro percentiles especificados en "quantvector" de columnas x 148 filas de las deiferentes distribuciones). A modo de curiosidad. Mi base de datos original en verdad tiene muchas mas variables a parte de"shape1" y "shape2". Usando esta base de datos original la funcion 'apply' no funcionaria verdad? Para correr tu codigo he creado una nueva data.frame con solo las dos columnas de interes. Muchas gracias de nuevo por el tiempo empleado en atenderme. Atentamente, Javi ________________________________ De: Carlos Ortega <cof en qualityexcellence.es> Enviado: jueves, 12 de julio de 2018 13:15 Para: javier bueno enciso Cc: r-help-es en r-project.org Asunto: Re: [R-es] Problemas con la funcion "apply" Hola, Efectivamente la funci?n "apply" te ayudar?a mucho en este caso, y no hace falta que pases por crear la funci?n y evaluarla como haces. Ser?a algo as?. quantvector=c(0.001,0.005,0.95,0.999) res_ults <- apply(tu_dataframe, 1, qbeta, p=quantvector, shape1 = tu_dataframe$shape1, shape2 = tu_dataframe$shape2) El "1" de apply est? indicando el MARGIN sobre el que ha de actuar de tu dataframe, en este caso las filas. Entiendo que tu dataframe tienbe una columna que es el "shape1" y otra el "shape2". Saludos, Carlos Ortega www.qualityexcellence.es<http://www.qualityexcellence.es> QualityExcellence<http://www.qualityexcellence.es/> www.qualityexcellence.es QUALITY EXCELLENCE, consultores en calidad, procesos y mejora continua El 12 de julio de 2018, 11:44, javier bueno enciso <jbuenoenciso en hotmail.com<mailto:jbuenoenciso en hotmail.com>> escribi?: Buenos dias! Os escribo para ver si me podeis ayudar con un asunto en el que me he quedado un poco encallado. Lo que tengo que hacer es sacar los percentiles (0.001, 0.005, 0.95 y 0.999) de varias distribuciones beta, concretamente 418. Cada distribucion esta definida por los parametros "shape1" y "shape2". Por lo tanto tengo una base de datos de 418 filas y en cada una de ellas los parametros que me definen la distribucion beta, shape1 y shape2. Tengo el siguiente codigo: distrname="beta" shape1= 0.2 #ejemplo shape2= 0.3 #ejemplo quantvector=c(0.001,0.005,0.95,0.999) (paste("qvector=q",distrname,"(quantvector, shape1, shape2)",sep="")) eval(parse(text= paste("qvector=q",distrname,"(quantvector, shape1, shape2)",sep="") )) qvector Donde tengo problemas es en aplicar el anterior codigo para cada una de las filas de mi base de datos, especificando que shape1 es "mydata$shape1" y shape2 es "mydata$shape2". He pensado que quizas podria hacer una funcion con el anterior codigo y hacer un loop posterior para que me la aplique para cada una de mis filas. Sin embargo estoy convencido de que tiene que haber una manera mas directa utilizando la funcion "apply" de R o alguna de sus "hermanas", que funcionaria mejor. Me podriais ayudar? cualquier pista me seria de gran utilidad. Muchas gracias!! Javi P.D. si necesitais cualquier otra info o un ejemplo de los datos, no dudeis en pedirmelo. [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org<mailto:R-help-es en r-project.org> https://stat.ethz.ch/mailman/listinfo/r-help-es -- Saludos, Carlos Ortega www.qualityexcellence.es<http://www.qualityexcellence.es> [[alternative HTML version deleted]]