Estimado Carlos Ortega



Muchas gracias, justo estaba por comenzar a intentar con dplyr, por lo cuál voy 
directo a data.table.




Su comentario es bueno pero no justo para mi caso .…, es que no escribí todo en 
mi consulta. En realidad usando Rvest consulto unos miles de sitios, donde uno 
va en respuesta del anterior, y cada resultado agrega unas letras o números, y 
de acuerdo a la cantidad de caracteres (por eso uso el if) conozco de donde 
vino la información, al realizar el corte quito la parte del “id” que no 
necesito.




Estoy realizando una comparación de principios activos en fármacos, donde hay 
vademecun de distintos países, y la diferencia entre veterinario o humano, 
dentro de veterinaria es por especies, razas como puede ser un perro chico a un 
gran danés (Pastor alemán), incluso en homeopatía la “dosis no importa”. Es un 
lío importante.




Incluso hay partes que no me responden de la misma forma, el web scraping es 
muy complicado, el ejemplo que expusieron alguno de ustedes en una jornada el 
año pasado, en mi computadora llega hasta un lugar y da error (luego de un 
tiempo de proceso, un ejercicio de consulta de vinos españoles).




Por desgracia, necesito el if, sin condicionales no tengo la menor idea de como 
hacerlo, agradezco nuevamente su intento por mejorar el código. Hay filtros 
donde no uso el if, pero en todos casos se acuerdo a una condición plateo un 
código R.


Voy a usar su código directamente para pasar a usar data.table (lo tengo en 
data.frame).


Gracias.






Javier Rubén Marcuzzi
Técnico en Industrias Lácteas
Veterinario





De: Carlos Ortega
Enviado el: ‎martes‎, ‎28‎ de ‎julio‎ de ‎2015 ‎06‎:‎11‎ ‎p.m.
Para: Javier Ruben Marcuzzi
CC: Jorge I Velez, Susana deus alvarez, R-help-es@r-project.org, daniel






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.marcu...@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
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@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.marcu...@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@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

Reply via email to