Hola Nuevamente necesito ayuda de ustedes, en muy pocas oportunidades escribí una función, diría que no tengo experiencia al respecto. Escribo el código en R (copiar y pegar) con los comentarios y descripción de los datos. Esperando que se entienda ... ####################################################### # Descricion de los datos (en orden de columnas) # 5 Personas que realizan una actividad, # por cada vez que se realiza se la numera # cada actividad numerada es realizada a x dias desde # la columna dias2 es generada para no tener blancos (vacíos) persona<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,4,5,5) numeracion <-c(1,2,3,4,5,1,2,3,4,5,1,2,3,1,1,2) dias <-c(1,3,4,6,9,2,4,6,7,9,2,5,8,3,5,8) dias2 <- c(1:length(dias)) datos <- data.frame(persona, numeracion, dias, dias2) datos # descripción de lo que debería realizar # observar la columna dias2 # cambia el primer valor y los ultimos (15 y 16) datos$dias2[datos$dias2 < max(datos$dias2)] <- datos$dias2[-1] datos$dias2[datos$dias2 == max(datos$dias2)] <- NA datos # al observar las columnas días y días2 me es fácil restar # entre ambas columnas para obtener la diferencia de tiempo ########### # Mi problema # lo descripto anteriormente debe tomar el valor maximo de cada # persona, no el maximo de todo el data.frame # (un max por persona) y (un [-1] por persona) # intente vosas como: # probar <- do.call(rbind, by(datos, datos$persona, datos$dias, function(x){... # todos intentos que no fueron correctos # ¿Me explico? ¿Ideas? [[alternative HTML version deleted]]
Hola Javier, Muchas gracias por el ejemplo. Si entiendo bien, creo que estas buscando lo siguiente: sapply(split(datos, persona), function(l) apply(l[, -1], 2, max)) # 1 2 3 4 5 # <-------- Personas # numeracion 5 5 3 1 2 # dias 9 9 8 3 8 # dias2 6 11 14 15 NA De no ser asi, podrias por favor explicarme(nos) de nuevo? ;-) Un saludo, Jorge 2011/9/25 Javier Rubén Marcuzzi <>> Hola > > Nuevamente necesito ayuda de ustedes, en muy pocas oportunidades escribí > una función, diría que no tengo experiencia al respecto. > > Escribo el código en R (copiar y pegar) con los comentarios y descripción > de los datos. > > Esperando que se entienda ... > > ####################################################### > # Descricion de los datos (en orden de columnas) > # 5 Personas que realizan una actividad, > # por cada vez que se realiza se la numera > # cada actividad numerada es realizada a x dias desde > # la columna dias2 es generada para no tener blancos (vacíos) > > persona<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,4,5,5) > numeracion <-c(1,2,3,4,5,1,2,3,4,5,1,2,3,1,1,2) > dias <-c(1,3,4,6,9,2,4,6,7,9,2,5,8,3,5,8) > dias2 <- c(1:length(dias)) > datos <- data.frame(persona, numeracion, dias, dias2) > datos > > # descripción de lo que debería realizar > # observar la columna dias2 > # cambia el primer valor y los ultimos (15 y 16) > datos$dias2[datos$dias2 < max(datos$dias2)] <- datos$dias2[-1] > datos$dias2[datos$dias2 == max(datos$dias2)] <- NA > datos > # al observar las columnas días y días2 me es fácil restar > # entre ambas columnas para obtener la diferencia de tiempo > > ########### > # Mi problema > # lo descripto anteriormente debe tomar el valor maximo de cada > # persona, no el maximo de todo el data.frame > # (un max por persona) y (un [-1] por persona) > > > # intente vosas como: > # probar <- do.call(rbind, by(datos, datos$persona, datos$dias, > function(x){... > # todos intentos que no fueron correctos > > # ¿Me explico? ¿Ideas? > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
O de manera equivalente : > tapply(datos$dias2,datos$persona,max) 1 2 3 4 5 5 10 13 14 16 o bien > tapply(datos$dias2,datos$persona,which.max) 1 2 3 4 5 5 5 3 1 2 -- ____________________________________ Olivier G. Nuñez Email: onunez en iberstat.es Tel : +34 663 03 69 09 Web: http://www.iberstat.es ____________________________________ El 26/09/2011, a las 5:13, Javier Rubén Marcuzzi escribió:> Hola > > Nuevamente necesito ayuda de ustedes, en muy pocas oportunidades > escribí una función, diría que no tengo experiencia al respecto. > > Escribo el código en R (copiar y pegar) con los comentarios y > descripción de los datos. > > Esperando que se entienda ... > > ####################################################### > # Descricion de los datos (en orden de columnas) > # 5 Personas que realizan una actividad, > # por cada vez que se realiza se la numera > # cada actividad numerada es realizada a x dias desde > # la columna dias2 es generada para no tener blancos (vacíos) > > persona<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,4,5,5) > numeracion <-c(1,2,3,4,5,1,2,3,4,5,1,2,3,1,1,2) > dias <-c(1,3,4,6,9,2,4,6,7,9,2,5,8,3,5,8) > dias2 <- c(1:length(dias)) > datos <- data.frame(persona, numeracion, dias, dias2) > datos > > # descripción de lo que debería realizar > # observar la columna dias2 > # cambia el primer valor y los ultimos (15 y 16) > datos$dias2[datos$dias2 < max(datos$dias2)] <- datos$dias2[-1] > datos$dias2[datos$dias2 == max(datos$dias2)] <- NA > datos > # al observar las columnas días y días2 me es fácil restar > # entre ambas columnas para obtener la diferencia de tiempo > > ########### > # Mi problema > # lo descripto anteriormente debe tomar el valor maximo de cada > # persona, no el maximo de todo el data.frame > # (un max por persona) y (un [-1] por persona) > > > # intente vosas como: > # probar <- do.call(rbind, by(datos, datos$persona, datos$dias, > function(x){... > # todos intentos que no fueron correctos > > # ¿Me explico? ¿Ideas? > [[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
Yo creo que te vendría bien echarle un vistazo a http://www.jstatsoft.org/v40/i01 El artículo trata sobre un paquete, plyr, que está diseñado para implementar la estrategia "divide-aplica-combina": 1) Primero divides tu problema en trozos (¿por persona?) 2) Solucionas tu problema para cada trozo. 3) Aplicas la solución a cada trozo y recompones la estructura de datos deseada con los resultados. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 26 de septiembre de 2011 05:13, Javier Rubén Marcuzzi <javier.ruben.marcuzzi en gmail.com> escribió:> Hola > > Nuevamente necesito ayuda de ustedes, en muy pocas oportunidades escribí una función, diría que no tengo experiencia al respecto. > > Escribo el código en R (copiar y pegar) con los comentarios y descripción de los datos. > > Esperando que se entienda ... > > ####################################################### > # Descricion de los datos (en orden de columnas) > # 5 Personas que realizan una actividad, > # por cada vez que se realiza se la numera > # cada actividad numerada es realizada a x dias desde > # la columna dias2 es generada para no tener blancos (vacíos) > > persona<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,4,5,5) > numeracion <-c(1,2,3,4,5,1,2,3,4,5,1,2,3,1,1,2) > dias <-c(1,3,4,6,9,2,4,6,7,9,2,5,8,3,5,8) > dias2 <- c(1:length(dias)) > datos <- data.frame(persona, numeracion, dias, dias2) > datos > > # descripción de lo que debería realizar > # observar la columna dias2 > # cambia el primer valor y los ultimos (15 y 16) > datos$dias2[datos$dias2 < max(datos$dias2)] <- datos$dias2[-1] > datos$dias2[datos$dias2 == max(datos$dias2)] <- NA > datos > # al observar las columnas días y días2 me es fácil restar > # entre ambas columnas para obtener la diferencia de tiempo > > ########### > # Mi problema > # lo descripto anteriormente debe tomar el valor maximo de cada > # persona, no el maximo de todo el data.frame > # (un max por persona) y (un [-1] por persona) > > > # intente vosas como: > # probar <- do.call(rbind, by(datos, datos$persona, datos$dias, function(x){... > # todos intentos que no fueron correctos > > # ¿Me explico? ¿Ideas? > [[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 > >