[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