[R-es] Consulta filtro múltiple.

Isidro Hidalgo Arellano |h|d@|go @end|ng |rom jccm@e@
Vie Jul 2 09:49:21 CEST 2021


¡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 <cof using qualityexcellence.es> 
Enviado el: jueves, 1 de julio de 2021 16:19
Para: Isidro Hidalgo Arellano <ihidalgo using jccm.es>
CC: Lista R <r-help-es using r-project.org>
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 (<cof using qualityexcellence.es <mailto:cof using qualityexcellence.es> >) 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 (<ihidalgo using jccm.es <mailto:ihidalgo using jccm.es> >) 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 <r-help-es-bounces using r-project.org <mailto:r-help-es-bounces using r-project.org> > En nombre de miguel.angel.rodriguez.muinos using sergas.es <mailto:miguel.angel.rodriguez.muinos using sergas.es> 
Enviado el: jueves, 1 de julio de 2021 12:17
Para: cof using qualityexcellence.es <mailto:cof using qualityexcellence.es> 
CC: r-help-es using r-project.org <mailto:r-help-es using r-project.org> 
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 <cof using qualityexcellence.es <mailto:cof using qualityexcellence.es> >
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]]



Más información sobre la lista de distribución R-help-es