Jorge I Velez
2014-Mar-07 14:26 UTC
[R-es] Identificar pares de valores en distintas filas
Hola Francisco y Carlos, Quizas lo siguiente funcione para 2, 3 o mas IDs con FECHA y VALOR comun (aqui el maximo es 3): d <- data.frame(ID = 1:8, FECHA = c("01/04/1965", "01/09/1988", "01/04/2004", "01/04/1965", "01/05/1992", "01/04/1965", "01/09/1988", "01/09/1988"), VALOR = c(25578, 23456, 76578, 25578, 33724, 65789, 23456, 23456)) d$comb <- with(d, paste0(FECHA, "_", VALOR)) s <- with(d, split(d, comb)) s <- s[sapply(s, function(l) NROW(l) > 1)] # mas de un ID ids <- sapply(s, "[", 1) k <- max(sapply(ids, length)) # maximo numero de IDs con FECHA/VALOR comunes out <- sapply(ids, function(x) x[1:k]) out <- t(out) out # [,1] [,2] [,3] #01/04/1965_25578.ID 1 4 NA #01/09/1988_23456.ID 2 7 8 El NA se genera porque en la 2a combinacion (FECHA = 01/09/1988, VALOR 23456) hay 3 IDs (2, 7 y 9) y en la 1ra combinacion solo dos (1 y 4). Saludos, Jorge.- 2014-03-08 1:01 GMT+11:00 Carlos Ortega <cof@qualityexcellence.es>:> Hola, > > Sí, pensé en ello y puedes con el paquete "combinat" crear combinaciones de > 3, 2 elementos donde cada elemento es una combinación de los strings > "DATE-VALOR" (obtenidos con un unique) y sobre el resultado hacer un merge > sobre los datos completos de tu data.frame igualmente con la combinación > "DATE-VALOR"... > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > El 7 de marzo de 2014, 14:39, Francisco Javier <iterador10@hotmail.com > >escribió: > > > Muchas gracias a todos por vuestras respuestas! Me han sido de gran > ayuda. > > > > > > > > Carlos, tienes toda la razón con el tema de que podría haber casos > > triplicados (de hecho los hay). > > > > Se me ocurre como solución "para salir del apuro" aplicar un intersect. > > > > > > > > Muchas gracias. > > > > > > > > Fco. Javier > > > > [[alternative HTML version deleted]] > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es > > [[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]]
"Marcuzzi, Javier Rubén"
2014-Mar-07 15:15 UTC
[R-es] Identificar pares de valores en distintas filas
Estimado Francisco Me parece bueno este script, en cosas como estas pensé yo cuándo sugerí que vuelva a leer R, porque mi experiencia de error cuándo comencé con R fue buscar una librería que resuelva mi problema cuándo en realidad tenía que aprender lo básico. Luego de enviar mi correo anterior pensé en que con otra redacción o algún ejemplo podría haber sido amable. Una forma distinta pero que podría funcionar es utilizar expand para crear una matriz con todas las posibilidades de fecha valor, luego recorrer buscando el índice donde coincide con el dato real, relacionando ambos, y el tercer paso sería ordenar (filtrar) por este índice donde estarían todos los que coinciden. Es más engorroso, pero podría funcionar si hay complicaciones. Javier Marcuzzi El 07/03/14 11:26, Jorge I Velez escribió:> Hola Francisco y Carlos, > > Quizas lo siguiente funcione para 2, 3 o mas IDs con FECHA y VALOR comun > (aqui el maximo es 3): > > d <- data.frame(ID = 1:8, > FECHA = c("01/04/1965", "01/09/1988", "01/04/2004", "01/04/1965", > "01/05/1992", "01/04/1965", "01/09/1988", "01/09/1988"), > VALOR = c(25578, 23456, 76578, 25578, 33724, 65789, 23456, 23456)) > > d$comb <- with(d, paste0(FECHA, "_", VALOR)) > s <- with(d, split(d, comb)) > s <- s[sapply(s, function(l) NROW(l) > 1)] # mas de un ID > ids <- sapply(s, "[", 1) > k <- max(sapply(ids, length)) # maximo numero de IDs con FECHA/VALOR > comunes > out <- sapply(ids, function(x) x[1:k]) > out <- t(out) > out > # [,1] [,2] [,3] > #01/04/1965_25578.ID 1 4 NA > #01/09/1988_23456.ID 2 7 8 > > El NA se genera porque en la 2a combinacion (FECHA = 01/09/1988, VALOR > 23456) hay 3 IDs (2, 7 y 9) y en la 1ra combinacion solo dos (1 y 4). > > Saludos, > Jorge.- > > > 2014-03-08 1:01 GMT+11:00 Carlos Ortega <cof@qualityexcellence.es>: > >> Hola, >> >> Sí, pensé en ello y puedes con el paquete "combinat" crear combinaciones de >> 3, 2 elementos donde cada elemento es una combinación de los strings >> "DATE-VALOR" (obtenidos con un unique) y sobre el resultado hacer un merge >> sobre los datos completos de tu data.frame igualmente con la combinación >> "DATE-VALOR"... >> >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> >> El 7 de marzo de 2014, 14:39, Francisco Javier <iterador10@hotmail.com >>> escribió: >>> Muchas gracias a todos por vuestras respuestas! Me han sido de gran >> ayuda. >>> >>> >>> Carlos, tienes toda la razón con el tema de que podría haber casos >>> triplicados (de hecho los hay). >>> >>> Se me ocurre como solución "para salir del apuro" aplicar un intersect. >>> >>> >>> >>> Muchas gracias. >>> >>> >>> >>> Fco. Javier >>> >>> [[alternative HTML version deleted]] >>> >>> >>> _______________________________________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >>> >> >> -- >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> [[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]] > > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es[[alternative HTML version deleted]]
En lo personal, anoté en mi lista de utilitarios las respuestas de Carlos Gil Bellosta y Jorge Velez uniéndolas como sigue: d <- data.frame(ID = 1:8, FECHA = c("01/04/1965", "01/09/1988", "01/04/2004", "01/04/1965", "01/05/1992", "01/04/1965", "01/09/1988", "01/09/1988"), VALOR = c(25578, 23456, 76578, 25578, 33724, 65789, 23456, 23456)) library(plyr) res <- dlply(d, .(FECHA,VALOR), function(x) x$ID) k <- length(res) out <- t( sapply(res, function(x) x[1:k])) out Cuatro líneas cortas, fáciles de leer. Me gustó (significa que creo que aprendí algo) el uso de plyr. Daniel Merino El 7 de marzo de 2014, 12:15, "Marcuzzi, Javier Rubén" < javier.ruben.marcuzzi@gmail.com> escribió:> Estimado Francisco > > Me parece bueno este script, en cosas como estas pensé yo cuándo sugerí > que vuelva a leer R, porque mi experiencia de error cuándo comencé con R > fue buscar una librería que resuelva mi problema cuándo en realidad > tenía que aprender lo básico. Luego de enviar mi correo anterior pensé > en que con otra redacción o algún ejemplo podría haber sido amable. > > Una forma distinta pero que podría funcionar es utilizar expand para > crear una matriz con todas las posibilidades de fecha valor, luego > recorrer buscando el índice donde coincide con el dato real, > relacionando ambos, y el tercer paso sería ordenar (filtrar) por este > índice donde estarían todos los que coinciden. Es más engorroso, pero > podría funcionar si hay complicaciones. > > Javier Marcuzzi > > El 07/03/14 11:26, Jorge I Velez escribió: > > Hola Francisco y Carlos, > > > > Quizas lo siguiente funcione para 2, 3 o mas IDs con FECHA y VALOR comun > > (aqui el maximo es 3): > > > > d <- data.frame(ID = 1:8, > > FECHA = c("01/04/1965", "01/09/1988", "01/04/2004", "01/04/1965", > > "01/05/1992", "01/04/1965", "01/09/1988", "01/09/1988"), > > VALOR = c(25578, 23456, 76578, 25578, 33724, 65789, 23456, 23456)) > > > > d$comb <- with(d, paste0(FECHA, "_", VALOR)) > > s <- with(d, split(d, comb)) > > s <- s[sapply(s, function(l) NROW(l) > 1)] # mas de un ID > > ids <- sapply(s, "[", 1) > > k <- max(sapply(ids, length)) # maximo numero de IDs con FECHA/VALOR > > comunes > > out <- sapply(ids, function(x) x[1:k]) > > out <- t(out) > > out > > # [,1] [,2] [,3] > > #01/04/1965_25578.ID 1 4 NA > > #01/09/1988_23456.ID 2 7 8 > > > > El NA se genera porque en la 2a combinacion (FECHA = 01/09/1988, VALOR > > 23456) hay 3 IDs (2, 7 y 9) y en la 1ra combinacion solo dos (1 y 4). > > > > Saludos, > > Jorge.- > > > > > > 2014-03-08 1:01 GMT+11:00 Carlos Ortega <cof@qualityexcellence.es>: > > > >> Hola, > >> > >> Sí, pensé en ello y puedes con el paquete "combinat" crear > combinaciones de > >> 3, 2 elementos donde cada elemento es una combinación de los strings > >> "DATE-VALOR" (obtenidos con un unique) y sobre el resultado hacer un > merge > >> sobre los datos completos de tu data.frame igualmente con la combinación > >> "DATE-VALOR"... > >> > >> Saludos, > >> Carlos Ortega > >> www.qualityexcellence.es > >> > >> > >> El 7 de marzo de 2014, 14:39, Francisco Javier <iterador10@hotmail.com > >>> escribió: > >>> Muchas gracias a todos por vuestras respuestas! Me han sido de gran > >> ayuda. > >>> > >>> > >>> Carlos, tienes toda la razón con el tema de que podría haber casos > >>> triplicados (de hecho los hay). > >>> > >>> Se me ocurre como solución "para salir del apuro" aplicar un intersect. > >>> > >>> > >>> > >>> Muchas gracias. > >>> > >>> > >>> > >>> Fco. Javier > >>> > >>> [[alternative HTML version deleted]] > >>> > >>> > >>> _______________________________________________ > >>> R-help-es mailing list > >>> R-help-es@r-project.org > >>> https://stat.ethz.ch/mailman/listinfo/r-help-es > >>> > >>> > >> > >> -- > >> Saludos, > >> Carlos Ortega > >> www.qualityexcellence.es > >> > >> [[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]] > > > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- Daniel [[alternative HTML version deleted]]