Hola a todos, Tengo que construir un gráfico para una base de datos que tengo en el que representar para los individuos de esta base su altura vs peso en función de su edad. Para ello, hay que utilizar los gráficos condicionados. En primer lugar usé la función coplot pero cargando el paquete lattice se pueden utilizar funciones que generan gráficos más completos, como es el caso de la función que quiero usar, xyplot. En el caso más sencillo, con hacer: xyplot(PESO~ALTURA|EDAD,data=Data,xlab="ALTURA",ylab="PESO") ya está. El problema que tengo surge cuando quiero dividir la edad en tres (por ejemplo) intervalos equivalentes con el mismo rango. Leyendo un manual de ayuda, se sugiere seguir estos pasos: (Para leer la base de datos quakes, una vez cargado el paquete lattice, desde la consola de R se hace >quakes). mini <- min(quakes$depth) maxi <- max(quakes$depth) int <- ceiling((maxi-mini)/9) (9 intervalos) inf <- seq(mini,maxi,int) quakes$depth.cat <- factor(floor(((quakes$depth-mini)/int)),labels=paste (inf,inf+int,sep="-")) xyplot(long~lat|depth.cat,data=quakes) Estas líneas hacen justo lo que necesito, pero no entiendo para qué se hace floor(((quakes$depth-mini)/int)). Tengo claro que así identifica los mismos números que resultan de esta operación con el mismo intervalo de (inf,inf+int,sep="-") pero lo que quiero decir es que no entiendo la idea que te lleva a restar cada elemento de la columna depth menos el mínimo y luego dividir por int. Cualquier ayuda será de utilidad, incluso para otras maneras de dividir los valores de una columna en intervalos equivalentes. (La función ?equal.count no me sirve porque se solapan datos). Muchas gracias.
Echa un vistazo a la función cut(). Un saludo. Olivier -- ____________________________________ Olivier G. Nuñez Email: onunez en iberstat.es Tel : +34 663 03 69 09 Web: http://www.iberstat.es ____________________________________ El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió:> Cualquier ayuda será de utilidad, incluso para otras maneras de > dividir > los valores de una columna en intervalos equivalentes. > (La función ?equal.count no me sirve porque se solapan datos).
Hola, Gracias por contestar. Sí, la función cut() me divide los datos en tres intervalos, se me había olvidado ponerlo, lo que me ocurre en este caso es que no sé como incorporar esto a la función xyplot. Un saludo> Echa un vistazo a la función cut(). > Un saludo. Olivier > -- > ____________________________________ > > Olivier G. Nuñez > Email: onunez en iberstat.es > Tel : +34 663 03 69 09 > Web: http://www.iberstat.es > > ____________________________________ > > > > > El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió: > > > Cualquier ayuda será de utilidad, incluso para otras maneras de > > dividir > > los valores de una columna en intervalos equivalentes. > > (La función ?equal.count no me sirve porque se solapan datos). > > >
Hola, que tal? lo que está haciendo esa linea de comando es restarle el minimo a depth, lo divide por el número que divide a la variable en nueve intervalos y después lo redondea hacia abajo. Otra opción más compacta es usar la función cut que hace exactamente lo mismo, usa ?cut para ver la ayuda. Luciano El día 11 de noviembre de 2009 05:45, <guivivi en alumni.uv.es> escribió:> Hola a todos, > > Tengo que construir un gráfico para una base de datos que tengo en el > que representar para los individuos de esta base su altura vs peso en > función de su edad. > Para ello, hay que utilizar los gráficos condicionados. > En primer lugar usé la función coplot pero cargando el paquete lattice > se pueden utilizar funciones que generan gráficos más completos, como > es el caso de la función que quiero usar, xyplot. > En el caso más sencillo, con hacer: > xyplot(PESO~ALTURA|EDAD,data=Data,xlab="ALTURA",ylab="PESO") ya está. > > El problema que tengo surge cuando quiero dividir la edad en tres (por > ejemplo) intervalos equivalentes con el mismo rango. > Leyendo un manual de ayuda, se sugiere seguir estos pasos: > (Para leer la base de datos quakes, una vez cargado el paquete lattice, > desde la consola de R se hace >quakes). > > mini <- min(quakes$depth) > maxi <- max(quakes$depth) > int <- ceiling((maxi-mini)/9) (9 intervalos) > inf <- seq(mini,maxi,int) > quakes$depth.cat <- factor(floor(((quakes$depth-mini)/int)),labels=paste > (inf,inf+int,sep="-")) > xyplot(long~lat|depth.cat,data=quakes) > > Estas líneas hacen justo lo que necesito, pero no entiendo para qué se > hace floor(((quakes$depth-mini)/int)). > Tengo claro que así identifica los mismos números que resultan de esta > operación con el mismo intervalo de (inf,inf+int,sep="-") pero lo que > quiero decir es que no entiendo la idea que te lleva a restar cada > elemento de la columna depth menos el mínimo y luego dividir por int. > > Cualquier ayuda será de utilidad, incluso para otras maneras de dividir > los valores de una columna en intervalos equivalentes. > (La función ?equal.count no me sirve porque se solapan datos). > > Muchas gracias. > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >
Hola, no había visto los mensajes anteriores. Para incorporarlo a al xyplot puedes usar el comando cut con sus opciones en la llamada de xyplot xyplot(PESO~ALTURA|cut(EDAD, breaks=3),data=Data,xlab="ALTURA",ylab="PESO") Otra opción es crear una nueva variable donde guardes los resultados de cut y llames a esa variable en la función xyplot en vez de la variable edad. Espero que te sirva de ayuda. Un saludo Luciano El día 11 de noviembre de 2009 05:57, <guivivi en alumni.uv.es> escribió:> Hola, > > Gracias por contestar. Sí, la función cut() me divide los datos en tres > intervalos, se me había olvidado ponerlo, lo que me ocurre en este caso > es que no sé como incorporar esto a la función xyplot. > > Un saludo > >> Echa un vistazo a la función cut(). >> Un saludo. Olivier >> -- >> ____________________________________ >> >> Olivier G. Nuñez >> Email: onunez en iberstat.es >> Tel : +34 663 03 69 09 >> Web: http://www.iberstat.es >> >> ____________________________________ >> >> >> >> >> El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió: >> >> > Cualquier ayuda será de utilidad, incluso para otras maneras de >> > dividir >> > los valores de una columna en intervalos equivalentes. >> > (La función ?equal.count no me sirve porque se solapan datos). >> >> >> > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >
Hola, Me encuentro ahora con un problema con la función cut y es que me divide las edades en tres intervalos pero los límites de esos intervalos son números decimales cuando la edad viene en números naturales. ¿Los puedo redondear?, parece que ni floor ni ceiling me sirven. Gracias y un saludo> Hola, no había visto los mensajes anteriores. Para incorporarlo a al > xyplot puedes usar el comando cut con sus opciones en la llamada de > xyplot > > xyplot(PESO~ALTURA|cut(EDAD,breaks=3),data=Data,xlab="ALTURA",ylab="PESO")> > Otra opción es crear una nueva variable donde guardes los resultados > de cut y llames a esa variable en la función xyplot en vez de la > variable edad. > Espero que te sirva de ayuda. > Un saludo > Luciano > > > > El día 11 de noviembre de 2009 05:57, <guivivi en alumni.uv.es>escribió:> > Hola, > > > > Gracias por contestar. Sí, la función cut() me divide los datos entres> > intervalos, se me había olvidado ponerlo, lo que me ocurre en estecaso> > es que no sé como incorporar esto a la función xyplot. > > > > Un saludo > > > >> Echa un vistazo a la función cut(). > >> Un saludo. Olivier > >> -- > >> ____________________________________ > >> > >> Olivier G. Nuñez > >> Email: onunez en iberstat.es > >> Tel : +34 663 03 69 09 > >> Web: http://www.iberstat.es > >> > >> ____________________________________ > >> > >> > >> > >> > >> El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió: > >> > >> > Cualquier ayuda será de utilidad, incluso para otras maneras de > >> > dividir > >> > los valores de una columna en intervalos equivalentes. > >> > (La función ?equal.count no me sirve porque se solapan datos). > >> > >> > >> > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > >
Hola, si te fijas en la ayuda dice que con el argumento breaks puedes poner el número de intervalos en que quieres dividir la variable o los cortes donde poner la variable. Pienso que yo haria algo parecido al ejemplo que mandaste vos. int<-ceiling((max(edad)-min(edad))/3) #largo del intervalo cortes<-seq(min(edad),max(edad),int) #Creo los lugares donde cortar edad.cat<-cut(edad,breaks=cortes) No lo he probado así que quizá tenga algún error, pero eso debería funcionar Luciano El día 11 de noviembre de 2009 09:56, <guivivi en alumni.uv.es> escribió:> Hola, > > Me encuentro ahora con un problema con la función cut y es que me > divide las edades en tres intervalos pero los límites de esos > intervalos son números decimales cuando la edad viene en números > naturales. > ¿Los puedo redondear?, parece que ni floor ni ceiling me sirven. > > Gracias y un saludo > >> Hola, no había visto los mensajes anteriores. Para incorporarlo a al >> xyplot puedes usar el comando cut con sus opciones en la llamada de >> xyplot >> >> xyplot(PESO~ALTURA|cut(EDAD, > breaks=3),data=Data,xlab="ALTURA",ylab="PESO") >> >> Otra opción es crear una nueva variable donde guardes los resultados >> de cut y llames a esa variable en la función xyplot en vez de la >> variable edad. >> Espero que te sirva de ayuda. >> Un saludo >> Luciano >> >> >> >> El día 11 de noviembre de 2009 05:57, <guivivi en alumni.uv.es> > escribió: >> > Hola, >> > >> > Gracias por contestar. Sí, la función cut() me divide los datos en > tres >> > intervalos, se me había olvidado ponerlo, lo que me ocurre en este > caso >> > es que no sé como incorporar esto a la función xyplot. >> > >> > Un saludo >> > >> >> Echa un vistazo a la función cut(). >> >> Un saludo. Olivier >> >> -- >> >> ____________________________________ >> >> >> >> Olivier G. Nuñez >> >> Email: onunez en iberstat.es >> >> Tel : +34 663 03 69 09 >> >> Web: http://www.iberstat.es >> >> >> >> ____________________________________ >> >> >> >> >> >> >> >> >> >> El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió: >> >> >> >> > Cualquier ayuda será de utilidad, incluso para otras maneras de >> >> > dividir >> >> > los valores de una columna en intervalos equivalentes. >> >> > (La función ?equal.count no me sirve porque se solapan datos). >> >> >> >> >> >> >> > >> > _______________________________________________ >> > R-help-es mailing list >> > R-help-es en r-project.org >> > https://stat.ethz.ch/mailman/listinfo/r-help-es >> > >> >> > > >
Hola, en verdad tu problema de que este las etiquetas como número decimal se puede solucionar simplemente cambiando las etiquetas. Que es mucho más simple lo que estaba tratando de hacer. Como no hay edad decimales no hay problema en cambiarla a un número natural (igualmente es un cambio puramente estético, cut esta cortando en esos lugares decimales). Hay solo dos cortes porque está mal hecho el vector de cortes, hay que agregarle un 90), entonces quedan los intervalos 60-70, 70-80, 80-90. y ponerle a cut la opción include.lowest=TRUE para que incluya los 60. Para cambiar las etiquetas del resultado del comando cut(edad,3): edad.cat<-factor(edad.cat, labels=c('60-70', '70-80', '80-90')) Luciano El día 11 de noviembre de 2009 11:11, <guivivi en alumni.uv.es> escribió:> Hola, desafortunadamente no sale lo que debería con las tres líneas que > me has pasado, porque me divide el intervalo en 2 y además algunos > elementos del vector edad.cat aparecen como NA. > > Si quieres puedes verlo tú mismo.Este es mi vector edad: > 77 77 77 77 77 77 72 72 72 72 72 72 78 78 78 78 78 78 73 73 73 73 73 73 > 69 69 69 69 69 69 86 86 86 86 86 86 80 80 80 80 80 80 80 80 80 80 80 80 > 64 64 64 64 86 86 86 86 86 86 62 62 62 62 62 62 82 82 82 82 75 75 75 75 > 75 75 73 73 73 73 73 73 75 75 75 75 75 75 70 70 70 70 70 70 80 80 80 80 > 80 80 73 73 73 73 73 73 75 75 75 75 81 81 81 81 81 81 78 78 78 78 78 78 > 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80 80 80 80 80 80 > 80 80 80 80 85 85 85 85 81 81 81 81 81 81 78 78 78 78 77 77 77 77 77 77 > 73 73 73 73 73 73 73 73 73 73 78 78 78 78 78 78 60 60 60 60 60 60 72 72 > 72 72 72 72 77 77 77 77 77 77 82 82 82 82 82 82 81 81 72 72 72 72 72 72 > 77 77 81 81 74 74 76 76 76 76 76 76 73 73 73 73 83 83 83 83 72 72 72 72 > 72 72 81 81 81 81 81 81 73 73 73 73 73 73 67 67 67 67 67 67 77 77 77 77 > 77 77 76 76 76 76 76 76 79 79 79 79 78 78 78 78 78 78 80 80 80 80 80 80 > 78 78 78 78 78 78 62 62 62 62 62 62 84 84 82 82 82 82 82 82 64 64 64 64 > 64 64 74 74 74 74 74 74 85 85 85 85 72 72 72 72 72 72 77 77 77 77 77 77 > 88 88 88 88 88 88 68 68 68 68 68 68 62 62 62 62 62 62 79 79 79 79 79 79 > 65 65 65 65 65 65 80 80 80 80 80 80 78 78 78 78 78 78 87 87 87 87 87 87 > 79 79 79 79 79 79 79 79 79 79 79 79 83 83 83 83 83 83 80 80 80 80 80 80 > 64 64 64 64 64 64 79 79 79 79 76 76 76 76 86 86 86 86 86 86 76 76 76 76 > 74 74 74 74 74 74 63 63 60 60 60 60 76 76 76 76 76 76 85 85 85 85 85 85 > 75 75 75 75 75 75 77 77 77 77 77 77 77 77 77 77 77 77 77 77 75 75 84 84 > 84 84 84 84 66 66 66 66 66 66 63 63 63 63 63 63 65 65 65 65 65 65 72 72 > 72 72 72 72 81 81 81 81 81 81 71 71 71 71 71 71 72 72 72 72 72 72 72 72 > 72 72 72 72 76 76 76 76 76 76 78 78 78 78 78 78 69 69 69 69 69 69 79 79 > 79 79 79 79 82 82 82 82 82 82 80 80 80 80 80 80 76 76 76 76 76 76 77 77 > 77 77 84 84 84 84 84 84 82 82 82 82 82 82 82 82 82 82 82 82 82 82 78 78 > 78 78 78 78 81 81 81 81 81 81 78 78 78 78 85 85 85 85 79 79 79 79 79 79 > 78 78 76 76 76 76 72 72 72 72 80 80 80 80 80 80 75 75 75 75 75 75 80 80 > 80 80 86 86 86 86 78 78 78 78 78 78 72 72 72 72 72 72 78 78 78 78 78 78 > 77 77 77 77 77 77 79 79 79 79 80 80 80 80 86 86 86 86 86 86 81 81 81 81 > 81 81 88 88 88 88 88 88 84 84 84 84 84 84 74 74 74 74 74 74 76 76 76 76 > 76 76 > > Gracias y un saludo > >> Hola, si te fijas en la ayuda dice que con el argumento breaks puedes >> poner el número de intervalos en que quieres dividir la variable o los >> cortes donde poner la variable. Pienso que yo haria algo parecido al >> ejemplo que mandaste vos. >> >> int<-ceiling((max(edad)-min(edad))/3) #largo del intervalo >> cortes<-seq(min(edad),max(edad),int) #Creo los lugares donde cortar >> edad.cat<-cut(edad,breaks=cortes) >> >> No lo he probado así que quizá tenga algún error, pero eso debería > funcionar >> >> Luciano >> >> >> >> El día 11 de noviembre de 2009 09:56, <guivivi en alumni.uv.es> > escribió: >> > Hola, >> > >> > Me encuentro ahora con un problema con la función cut y es que me >> > divide las edades en tres intervalos pero los límites de esos >> > intervalos son números decimales cuando la edad viene en números >> > naturales. >> > ¿Los puedo redondear?, parece que ni floor ni ceiling me sirven. >> > >> > Gracias y un saludo >> > >> >> Hola, no había visto los mensajes anteriores. Para incorporarlo a > al >> >> xyplot puedes usar el comando cut con sus opciones en la llamada de >> >> xyplot >> >> >> >> xyplot(PESO~ALTURA|cut(EDAD, >> > breaks=3),data=Data,xlab="ALTURA",ylab="PESO") >> >> >> >> Otra opción es crear una nueva variable donde guardes los > resultados >> >> de cut y llames a esa variable en la función xyplot en vez de la >> >> variable edad. >> >> Espero que te sirva de ayuda. >> >> Un saludo >> >> Luciano >> >> >> >> >> >> >> >> El día 11 de noviembre de 2009 05:57, <guivivi en alumni.uv.es> >> > escribió: >> >> > Hola, >> >> > >> >> > Gracias por contestar. Sí, la función cut() me divide los datos > en >> > tres >> >> > intervalos, se me había olvidado ponerlo, lo que me ocurre en > este >> > caso >> >> > es que no sé como incorporar esto a la función xyplot. >> >> > >> >> > Un saludo >> >> > >> >> >> Echa un vistazo a la función cut(). >> >> >> Un saludo. Olivier >> >> >> -- >> >> >> ____________________________________ >> >> >> >> >> >> Olivier G. Nuñez >> >> >> Email: onunez en iberstat.es >> >> >> Tel : +34 663 03 69 09 >> >> >> Web: http://www.iberstat.es >> >> >> >> >> >> ____________________________________ >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> El 11/11/2009, a las 9:45, <guivivi en alumni.uv.es> escribió: >> >> >> >> >> >> > Cualquier ayuda será de utilidad, incluso para otras maneras > de >> >> >> > dividir >> >> >> > los valores de una columna en intervalos equivalentes. >> >> >> > (La función ?equal.count no me sirve porque se solapan datos). >> >> >> >> >> >> >> >> >> >> >> > >> >> > _______________________________________________ >> >> > R-help-es mailing list >> >> > R-help-es en r-project.org >> >> > https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> > >> >> >> >> >> > >> > >> > >> >> > > >