Hola Javier, Intenta los siguientes cambios g4 <- function(codigo_llega, n_caracteres){ codigo_llega <- as.character(codigo_llega) if(n_caracteres == 6) res <- substr(codigo_llega, start=0, stop=4) else res <- codigo_llega res } g4 <- Vectorize(g4) x <- c('Jorge Velez','Javier Marcuzzi','Daniel Merino','Susana deus Alvarez', 'Carlos Ortega') g4(x, 6) g4(x, 4) Saludos cordiales, Jorge.- 2015-07-28 13:08 GMT+10:00 <javier.ruben.marcuzzi en gmail.com>:> Señores > > > > Tengo un problema, donde use distintas alternativas y el informe de error > es el mismo. > > > > Mi ultima alternativa es una función que copio y pego junto con un ejemplo > de uso. > > > g3 <- function(n_caracteres, codigo_llega){ > + if (n_caracteres == 6) > + { > + res <- substr(codigo_llega, start=0, stop=4) > + } > + else > + { > + res <- codigo_llega > + } > + res > + } > > g3(6,"Javier Marcuzzi") > [1] "Javi" > > Pero cuándo uso los datos reales, el mensaje de error es el siguiente > (copio y pego lo último que se ve junto con el mensaje) > > > [9989] QS01EE01 QS01EE02 QS01EE03 QS01EE04 QS01EE05 QS QS01 > QS01E QS01EX QS01EX01 QS01EX02 > [10000] QS > [ reached getOption("max.print") -- omitted 846 entries ] > 7148 Levels: QA QA01 QA01A QA01AA QA01AA01 QA01AA02 QA01AA03 QA01AA04 > QA01AA30 QA01AA51 QA01AB ... QV10XX03 > Warning message: > In if (n_caracteres == 4) { : > the condition has length > 1 and only the first element will be used > > > ¿Alguna idea sobre ese mensaje, aparentemente hasta el elemento 10.000 > funciona, luego tengo un problema (con la función que envío como con otras > alternativas) > > > > > > > > > Javier Rubén Marcuzzi > Técnico en Industrias Lácteas > Veterinario > [[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 >[[alternative HTML version deleted]]
javier.ruben.marcuzzi en gmail.com
2015-Jul-28 16:21 UTC
[R-es] función cantidad mayor de valores
Estimados Muchas gracias a ambos, la solución de Daniel Merino funciona, pero como el mismo dice debería haber otra forma optimizada, y la de Jorge I Velez está optimizada. Utilizando ambas en mis datos, la de Daniel en media hora no termina de procesar, la de Jorge en segundos da un resultado. Hoy a la mañana se me ocurrió usar dplyr, posiblemente en ese enfoque ambas den resultado en tiempos razonables, pero aún no lo se, tengo que intentarlo. Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario De: Jorge I Velez Enviado el: ?martes?, ?28? de ?julio? de ?2015 ?10?:?13? ?a.m. Para: Javier Ruben Marcuzzi CC: Carlos Ortega, Susana deus alvarez, R-help-es en r-project.org, daniel Hola Javier, Intenta los siguientes cambios g4 <- function(codigo_llega, n_caracteres){ codigo_llega <- as.character(codigo_llega) if(n_caracteres == 6) res <- substr(codigo_llega, start=0, stop=4) else res <- codigo_llega res } g4 <- Vectorize(g4) x <- c('Jorge Velez','Javier Marcuzzi','Daniel Merino','Susana deus Alvarez', 'Carlos Ortega') g4(x, 6) g4(x, 4) Saludos cordiales, Jorge.- 2015-07-28 13:08 GMT+10:00 <javier.ruben.marcuzzi en gmail.com>: Señores Tengo un problema, donde use distintas alternativas y el informe de error es el mismo. Mi ultima alternativa es una función que copio y pego junto con un ejemplo de uso.> g3 <- function(n_caracteres, codigo_llega){+ if (n_caracteres == 6) + { + res <- substr(codigo_llega, start=0, stop=4) + } + else + { + res <- codigo_llega + } + res + }> g3(6,"Javier Marcuzzi")[1] "Javi" Pero cuándo uso los datos reales, el mensaje de error es el siguiente (copio y pego lo último que se ve junto con el mensaje) [9989] QS01EE01 QS01EE02 QS01EE03 QS01EE04 QS01EE05 QS QS01 QS01E QS01EX QS01EX01 QS01EX02 [10000] QS [ reached getOption("max.print") -- omitted 846 entries ] 7148 Levels: QA QA01 QA01A QA01AA QA01AA01 QA01AA02 QA01AA03 QA01AA04 QA01AA30 QA01AA51 QA01AB ... QV10XX03 Warning message: In if (n_caracteres == 4) { : the condition has length > 1 and only the first element will be used ¿Alguna idea sobre ese mensaje, aparentemente hasta el elemento 10.000 funciona, luego tengo un problema (con la función que envío como con otras alternativas) Javier Rubén Marcuzzi Técnico en Industrias Lácteas Veterinario [[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 [[alternative HTML version deleted]]
Hola, He probado con un par de opciones más, además de la de Jorge y al tiempo he medido tiempos de ejecución. Si no lo he entendido mal, si siempre voy a cortar la cadena y quedarme con los 4 primeros caracteres, pues directamente cojo esos cuatro primeros caracteres, independientemente de cómo me llegue la cadena. El hacer la prueba lógica (el "if") ya consume tiempo de ejecución. #---------------------------------------------- library(randomNames) library(stringr) library(data.table) library(microbenchmark) nomBres <- randomNames(10000, which.names="first") #---------- f1 <- function(x=nomBres) { str_sub(nomBres,1,4 ) } #---------- f2 <- function(x=nomBres) { nombresDT <- as.data.table(nomBres) nombresDT[, str_sub(nomBres, 1,4)] } #---------- g4 <- function(codigo_llega, n_caracteres){ codigo_llega <- as.character(codigo_llega) if(n_caracteres == 6) res <- substr(codigo_llega, start=0, stop=4) else res <- codigo_llega res } g4 <- Vectorize(g4) #---------- #-------------------- #--------- Simulacion res <- microbenchmark( f1(nomBres) ,f2(nomBres) ,g4(nomBres,4) ,times=1000L ) print(res) #-------------------- Los resultados para un conjunto de *10.000 nombres *aleatorios son: ------------------------------------------ Unit: microseconds expr min lq mean median uq max neval f1(nomBres) 717.028 1006.545 1420.917 1198.032 1629.930 6294.977 1000 f2(nomBres) 1511.989 2055.613 2820.487 2364.573 3012.253 36416.495 1000 g4(nomBres, 4) 22899.259 35892.199 45235.071 42691.926 51581.988 247832.551 1000 ----------------------------------------- Y para *100.000 nombres*: ----------------------------------------- Unit: milliseconds expr min lq mean median uq max neval f1(nomBres) 8.440287 11.58724 15.36027 13.92592 17.08169 114.66245 1000 f2(nomBres) 9.869237 13.83940 18.13927 16.42183 20.45015 65.20311 1000 g4(nomBres, 4) 298.084214 418.46124 492.65566 470.31912 526.37157 2221.56586 1000 ----------------------------------------- No he probado con "dplyr" porque ya por experiencia, es más lento que data.table. Saludos, Carlos Ortega www.qualityexcellence.es El 28 de julio de 2015, 18:21, <javier.ruben.marcuzzi en gmail.com> escribió:> Estimados > > Muchas gracias a ambos, la solución de Daniel Merino funciona, pero como > el mismo dice debería haber otra forma optimizada, y la de Jorge I Velez > está optimizada. > > Utilizando ambas en mis datos, la de Daniel en media hora no termina de > procesar, la de Jorge en segundos da un resultado. > > Hoy a la mañana se me ocurrió usar dplyr, posiblemente en ese enfoque > ambas den resultado en tiempos razonables, pero aún no lo se, tengo que > intentarlo. > > Javier Rubén Marcuzzi > Técnico en Industrias Lácteas > Veterinario > > *De:* Jorge I Velez <jorgeivanvelez en gmail.com> > *Enviado el:* ?martes?, ?28? de ?julio? de ?2015 ?10?:?13? ?a.m. > *Para:* Javier Ruben Marcuzzi <javier.ruben.marcuzzi en gmail.com> > *CC:* Carlos Ortega <cof en qualityexcellence.es>, Susana deus alvarez > <susanadeus.deusalvarez en gmail.com>, R-help-es en r-project.org > <r-help-es en r-project.org>, daniel <daniel319 en gmail.com> > > Hola Javier, > > Intenta los siguientes cambios > > g4 <- function(codigo_llega, n_caracteres){ > codigo_llega <- as.character(codigo_llega) > if(n_caracteres == 6) res <- substr(codigo_llega, start=0, stop=4) > else res <- codigo_llega > res > } > g4 <- Vectorize(g4) > x <- c('Jorge Velez','Javier Marcuzzi','Daniel Merino','Susana deus > Alvarez', 'Carlos Ortega') > g4(x, 6) > g4(x, 4) > > Saludos cordiales, > Jorge.- > > > > 2015-07-28 13:08 GMT+10:00 <javier.ruben.marcuzzi en gmail.com>: > >> Señores >> >> >> >> Tengo un problema, donde use distintas alternativas y el informe de error >> es el mismo. >> >> >> >> Mi ultima alternativa es una función que copio y pego junto con un >> ejemplo de uso. >> >> > g3 <- function(n_caracteres, codigo_llega){ >> + if (n_caracteres == 6) >> + { >> + res <- substr(codigo_llega, start=0, stop=4) >> + } >> + else >> + { >> + res <- codigo_llega >> + } >> + res >> + } >> > g3(6,"Javier Marcuzzi") >> [1] "Javi" >> >> Pero cuándo uso los datos reales, el mensaje de error es el siguiente >> (copio y pego lo último que se ve junto con el mensaje) >> >> >> [9989] QS01EE01 QS01EE02 QS01EE03 QS01EE04 QS01EE05 QS QS01 >> QS01E QS01EX QS01EX01 QS01EX02 >> [10000] QS >> [ reached getOption("max.print") -- omitted 846 entries ] >> 7148 Levels: QA QA01 QA01A QA01AA QA01AA01 QA01AA02 QA01AA03 QA01AA04 >> QA01AA30 QA01AA51 QA01AB ... QV10XX03 >> Warning message: >> In if (n_caracteres == 4) { : >> the condition has length > 1 and only the first element will be used >> >> >> ¿Alguna idea sobre ese mensaje, aparentemente hasta el elemento 10.000 >> funciona, luego tengo un problema (con la función que envío como con otras >> alternativas) >> >> >> >> >> >> >> >> >> Javier Rubén Marcuzzi >> Técnico en Industrias Lácteas >> Veterinario >> [[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]]