¡Muchas gracias, Carlos!

Entonces, los tiempos que pusiste al principio, en los que había grandes 
diferencias, ¿de dónde salieron?

¡Muchas gracias, como siempre, por tus grandes aportaciones!

 

Isidro Hidalgo Arellano

Observatorio del Mercado de Trabajo

Consejería de Economía, Empresas y Empleo

http://www.castillalamancha.es/

 

De: Carlos Ortega <[email protected]> 
Enviado el: jueves, 1 de julio de 2021 16:19
Para: Isidro Hidalgo Arellano <[email protected]>
CC: Lista R <[email protected]>
Asunto: Re: [R-es] Consulta filtro múltiple.

 

Hola,

 

Pues al final he terminado haciéndolo... :-)

 

Usando el paquete "babynames" que tiene casi dos millones de nombres y su 
frecuencia de aparición por año, se puede establecer la equivalencia de que los 
nombres son los medicamentos y las frecuencias son los valores que quiero 
encontrar.

 

Con este código, puedo seleccionar el número de nombres (medicamentos) a buscar 
y automáticamente también selecciona los valores.

El código también permite crear el número de condiciones que puedo crear (las 
condiciones pueden ser iguales o menores al número de nombres).

 

Y con todo eso, ya puedo comparar cómo de rápido son data.table, dplyr y base 
de forma comparada, considerando diferentes número de condiciones lógicas, 
sobre este conjunto de datos que ya es algo más que 10 líneas.

 

#-------------


library(babynames)
library(dplyr)
library(data.table)
library(tictoc)
library(microbenchmark)

midt <- setDT(copy(babynames))
midf <- as.data.table(midt)

#--- Ejemplo de condiciones que se buscan
# Elizabeth == 8915
# Michael == 88514
# David == 86251

# Selecciono nombres y su frecuencia (primera aparición) aleatoriamente
NUM_NOMBRES <- 1000
all_nam <- unique(midt[ , .(name)])
rnd_idx <- sample(1:nrow(all_nam), NUM_NOMBRES, replace = FALSE)
mi_names <- all_nam[ rnd_idx, .(name)]
mi_value <- midt[ name %chin% mi_names$name, .(n), by = name] %>% 
                 .[ , .SD[1], by = name]

#--- Crear condiciones automáticamente
#-- cond_end == Condiciones para data.table y dplyr
#-- cond_bas == Condiciones para base
NUM_CONDICIONES <- 50
cond_end <- vector() 
cond_bas <- vector()
for (i in 1:NUM_CONDICIONES) {
  name_val <- mi_value$name[i]
  n_val    <- mi_value$n[i]
  if (i < num_cond) {
      mi_cond  <- paste("( name == '" , name_val, "' & n == ", n_val, " ) | ", 
sep = "")
      mi_cond2 <- paste("( midf$name == '" , name_val, "' & midf$n == ", n_val, 
" ) | ", sep = "")
  } else {
      mi_cond  <- paste(" ( name == '" , name_val, "' & n == ", n_val, " )", 
sep = "")
      mi_cond2 <- paste(" ( midf$name == '" , name_val, "' & midf$n == ", 
n_val, " )", sep = "")
  }
  cond_end <- paste0(cond_end, mi_cond, collapse = "\n")
  cond_bas <- paste0(cond_bas, mi_cond2, collapse = "\n")
}

#------- COMPARACIONES ---------------
#-- data.table
tic()
midt[ eval(parse(text = cond_end )), ]
toc()

#-- dplyr
midf <- as.data.frame(midt)
tic()
midf %>%
  filter( eval(parse(text = cond_end )), )
toc()

#--- base
tic()
midf[ eval(parse(text = cond_bas )), ]
toc()


#------- BENCHMARKINGS --------------
microbenchmark(
  data.table = midt[ eval(parse(text = cond_end )), ] ,
  base       = midf[ eval(parse(text = cond_bas )), ] ,
  dplyr      = midf %>% filter( eval(parse(text = cond_end )), ) ,
  times = 25 
)

 

#------------

 

Los tiempos que he obtenido para 50 condiciones lógicas, evaluados 25 veces...

 

Unit: seconds
       expr      min       lq     mean   median       uq      max neval
 data.table 1.481466 1.543330 1.622688 1.598947 1.679465 1.866847    25
       base 1.518659 1.560412 1.621398 1.592776 1.641903 1.798532    25
      dplyr 1.505253 1.530137 1.571444 1.554524 1.597147 1.714049    25

 

 

 

Gracias,

Carlos Ortega

http://secure-web.cisco.com/190P89zEZCZg27zm--Pzdemoj-uaSTLJwnn27fi161HUE-cXUu0gxmnbJK84Jb_ku-3DYJtt0nYjUfXsdh88VdePSLOtQCDzI0IRf2P0Q1dw0G2luzk8x2FbOx4dJ5Dx5_HtngsrqD7P9qY9S9Iv1IrpkL7AYkr_UQbrVjLHQtQ7KC9Z8nxbygLfSTQtxw8S_9Z2jJ_7LFUdX8ew_68GEv5ImC6lxtJGguR_RYMvEED2CxRLWJ1lVSlq1DfuzHgsv62S0-wUkYSMH3UJXsJeC-80lLiShNMN-N4Rw1rEIEvc294fZ8sGQ1zFawzp_Sfn395zK2PnX3xOwQbJTiugIqw/http%3A%2F%2Fwww.qualityexcellence.es

 

El jue, 1 jul 2021 a las 14:51, Carlos Ortega (<[email protected] 
<mailto:[email protected]> >) escribió:

Hola,

 

Bueno, he comentado que estaría bien hacer eso... pero no lo he hecho... :-)...

 

Se puede extender el mínimo dataset que nos han compartido, pero lo suyo sería 
trabajar con todo el conjunto si fuese posible, por incluir más fármacos y muy 
importante tener más condiciones.

Todo esto se puede crear de forma sintética para el caso sencillo (las mismas 
condiciones planteadas) pero para incluir más condiciones costaría un tanto 
preparar ese dataset.

 

Si  alguien se ofrece para crear el conjunto base... corremos luego varias 
compartivas.

 

Gracias,

Carlos Ortega

http://secure-web.cisco.com/190P89zEZCZg27zm--Pzdemoj-uaSTLJwnn27fi161HUE-cXUu0gxmnbJK84Jb_ku-3DYJtt0nYjUfXsdh88VdePSLOtQCDzI0IRf2P0Q1dw0G2luzk8x2FbOx4dJ5Dx5_HtngsrqD7P9qY9S9Iv1IrpkL7AYkr_UQbrVjLHQtQ7KC9Z8nxbygLfSTQtxw8S_9Z2jJ_7LFUdX8ew_68GEv5ImC6lxtJGguR_RYMvEED2CxRLWJ1lVSlq1DfuzHgsv62S0-wUkYSMH3UJXsJeC-80lLiShNMN-N4Rw1rEIEvc294fZ8sGQ1zFawzp_Sfn395zK2PnX3xOwQbJTiugIqw/http%3A%2F%2Fwww.qualityexcellence.es

 

 

El jue, 1 jul 2021 a las 14:37, Isidro Hidalgo Arellano (<[email protected] 
<mailto:[email protected]> >) escribió:

Carlos,
¿Te importaría poner el código?
Mil gracias...

Isidro Hidalgo Arellano
Observatorio del Mercado de Trabajo
Consejería de Economía, Empresas y Empleo
http://www.castillalamancha.es/

-----Mensaje original-----
De: R-help-es <[email protected] 
<mailto:[email protected]> > En nombre de 
[email protected] 
<mailto:[email protected]> 
Enviado el: jueves, 1 de julio de 2021 12:17
Para: [email protected] <mailto:[email protected]> 
CC: [email protected] <mailto:[email protected]> 
Asunto: Re: [R-es] Consulta filtro múltiple.

Buen trabajo, Carlos.


Efectivamente, sqldf es muy poco eficiente (porque "recorre" varias veces la 
base adem�de que tiene que traducir las instrucciones).


Yo s�lo recomiendo para la gente que viene del mundo SQL (y del grandioso 
SELECT) y/o a los vagos que prefieran escribir poco c�o.

(yo cumplo las dos condiciones)


:-)


?

Un saludo,

Miguel.





________________________________
De: Carlos Ortega <[email protected] <mailto:[email protected]> 
>
Enviado: jueves, 1 de julio de 2021 11:57
Para: Rodr�ez Mu�s, Miguel �gel
Cc: juan manuel dias; Lista R
Asunto: Re: [R-es] Consulta filtro m�le.

 [ ... ]

Y el ganador en tiempos de ejecuci�s...

Unit: microseconds
      expr       min         lq       mean    median         uq       max neval
 datatable    99.376   198.8520   338.4575   232.609   300.4635  7845.888  1000
     dplyr  1417.242  1939.4520  2598.0892  2285.436  2884.1000 21591.185  1000
      base    62.119    99.7405   158.8749   119.255   156.1890 10826.685  1000
     sqldf 13058.622 16870.2300 21358.6144 19247.554 24269.0985 64807.865  1000

 [ ... ]



Saludos,
Carlos Ortega
http://secure-web.cisco.com/1sPMcNqTKgaZhCI3VHWDNPt8_Vz5bObsQ2pCpI6mALdCvwyT029ZW-ysfzukZ3rJw_JLfq3tp4HGeCTtarv64mANhWiqtSNw6eWZDkYL3pFw0Mf4Hx_YmTloiiwMhiH4at3c9HBAOyorwxRZbKClEi-JxpDosJjwQcIVT86Wygf27Pw4nI-yF7R0XhLNnfDbt8JrGM6GrqTB2Wtgqx4kVcJhNPmZ43oEzA-vHOyvU_IzV94U3bOinlD3q6bszB9KY-QH0OoIPQE69aJNCUipeKQ/http%3A%2F%2Fwww.qualityexcellence.es<http://secure-web.cisco.com/1sPMcNqTKgaZhCI3VHWDNPt8_Vz5bObsQ2pCpI6mALdCvwyT029ZW-ysfzukZ3rJw_JLfq3tp4HGeCTtarv64mANhWiqtSNw6eWZDkYL3pFw0Mf4Hx_YmTloiiwMhiH4at3c9HBAOyorwxRZbKClEi-JxpDosJjwQcIVT86Wygf27Pw4nI-yF7R0XhLNnfDbt8JrGM6GrqTB2Wtgqx4kVcJhNPmZ43oEzA-vHOyvU_IzV94U3bOinlD3q6bszB9KY-QH0OoIPQE69aJNCUipeKQ/http%3A%2F%2Fwww.qualityexcellence.es>



________________________________

Nota: A informaci�ontida nesta mensaxe e os seus posibles documentos adxuntos 
�rivada e confidencial e est�irixida �mente �u destinatario/a. Se vostede non 
�/a destinatario/a orixinal desta mensaxe, por favor elim�a. A distribuci�u 
copia desta mensaxe non est�utorizada.

Nota: La informaci�ontenida en este mensaje y sus posibles documentos adjuntos 
es privada y confidencial y est�irigida �mente a su destinatario/a. Si usted no 
es el/la destinatario/a original de este mensaje, por favor elim�lo. La 
distribuci� copia de este mensaje no est�utorizada.

See more languages: http://www.sergas.es/aviso-confidencialidad

        [[alternative HTML version deleted]]





-- 

Saludos,
Carlos Ortega
http://secure-web.cisco.com/190P89zEZCZg27zm--Pzdemoj-uaSTLJwnn27fi161HUE-cXUu0gxmnbJK84Jb_ku-3DYJtt0nYjUfXsdh88VdePSLOtQCDzI0IRf2P0Q1dw0G2luzk8x2FbOx4dJ5Dx5_HtngsrqD7P9qY9S9Iv1IrpkL7AYkr_UQbrVjLHQtQ7KC9Z8nxbygLfSTQtxw8S_9Z2jJ_7LFUdX8ew_68GEv5ImC6lxtJGguR_RYMvEED2CxRLWJ1lVSlq1DfuzHgsv62S0-wUkYSMH3UJXsJeC-80lLiShNMN-N4Rw1rEIEvc294fZ8sGQ1zFawzp_Sfn395zK2PnX3xOwQbJTiugIqw/http%3A%2F%2Fwww.qualityexcellence.es



-- 

Saludos,
Carlos Ortega
http://secure-web.cisco.com/190P89zEZCZg27zm--Pzdemoj-uaSTLJwnn27fi161HUE-cXUu0gxmnbJK84Jb_ku-3DYJtt0nYjUfXsdh88VdePSLOtQCDzI0IRf2P0Q1dw0G2luzk8x2FbOx4dJ5Dx5_HtngsrqD7P9qY9S9Iv1IrpkL7AYkr_UQbrVjLHQtQ7KC9Z8nxbygLfSTQtxw8S_9Z2jJ_7LFUdX8ew_68GEv5ImC6lxtJGguR_RYMvEED2CxRLWJ1lVSlq1DfuzHgsv62S0-wUkYSMH3UJXsJeC-80lLiShNMN-N4Rw1rEIEvc294fZ8sGQ1zFawzp_Sfn395zK2PnX3xOwQbJTiugIqw/http%3A%2F%2Fwww.qualityexcellence.es


        [[alternative HTML version deleted]]

_______________________________________________
R-help-es mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-help-es

Responder a