Sto cercando un modo efficiente per unire 2 data.frames/data.tables sulla colonna di caratteri usando la condizione grep/like/stri_detect.R join on like/grep condition
Sono in grado di utilizzare il pacchetto sqldf con join su like, ma è piuttosto lento. Sui miei 2 dati.tables (5k righe, 20k righe) ci vogliono circa 60 secondi.
Il mio secondo approccio era usare CJ da data.table e dopo che stri_detect_fixed su 2 colonne. Questo approccio è più veloce (16 secondi), ma temo che con i dati in crescita sarà impossibile da usare (aumenta in modo significativo l'utilizzo di ram).
Ho anche provato a farlo in ciclo for, ma era il più lento.
C'è un modo per farlo più veloce in particolare in data.table?
Di seguito incollo il mio esempio:
library(stringi)
library(data.table)
library(sqldf)
data1 <- data.table(col1 = paste0(c("asdasd asdasd 768jjhknmnmnj",
"78967ggh","kl00896754","kl008jku"),1:10000))
data2 <- data.table(col2 = paste0(c("mnj", "12345","kl008","lll1"), 1:10000))
system.time(join1 <- data.table(sqldf("select *
from data1 a inner join data2 b
on a.col1 like '%' || b.col2 || '%'", drv = "SQLite")))
system.time(kartezjan <- CJ(col1 = data1[,c("col1"), with = F][[1]],
col2 = data2[,c("col2"), with = F][[1]],
unique = TRUE)[stri_detect_fixed(col1, col2, case_insensitive = FALSE)])
Sulla mia macchina il codice sqldf sopra ha impiegato 89,02 secondi e ci sono voluti 69,06 secondi usando 'on instr (a.col1, b.col2)' invece di 'on ... come ... 'e 409,35 secondi con dati. tavolo. C'è una chiamata 'library (stringi)' mancante. –
I risultati dei tuoi esempi sono diversi. Forse dovresti dare un esempio semplice e spiegare cosa vuoi che succeda nei casi d'angolo. (Il valore in col1 non ha corrispondenza, il valore in col2 non ha corrispondenza e possibilità di corrispondenza multiple) Inoltre sarebbe utile sapere se ci sono alcuni vincoli sui valori. – bluefish
L'ho controllato con 'instr' ma è stato più lento che con' on ... come ... '. Ora aggiungo libreria e cambio join sinistro a inner join per rendere i risultati uguali. – Kacper