Tôi đang tìm cách hiệu quả để tham gia 2 data.frames/data.tables trên cột ký tự sử dụng điều kiện grep/like/stri_detect.R tham gia vào/grep điều kiện
Tôi có thể sử dụng gói sqldf với tham gia tương tự, nhưng khá chậm. Trên 2 data.tables của tôi (5k hàng, 20k hàng) phải mất khoảng 60 giây.
Cách tiếp cận thứ hai của tôi là sử dụng CJ từ data.table và sau đó stri_detect_fixed trên 2 cột. Cách tiếp cận này là nhanh hơn (16 giây) nhưng tôi sợ rằng với dữ liệu ngày càng tăng, nó sẽ không thể sử dụng (nó làm tăng đáng kể việc sử dụng ram).
Tôi cũng đã cố gắng làm điều đó trong vòng lặp nhưng nó là chậm nhất.
Có cách nào để thực hiện nhanh hơn đặc biệt là trong dữ liệu.
Dưới đây tôi dán ví dụ của tôi:
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)])
Trên máy tính của tôi, mã sqldf ở trên mất 89,02 giây và mất 69,06 giây bằng cách sử dụng 'on instr (a.col1, b.col2)' thay vì 'trên ... như ...' và 409,35 giây với dữ liệu. bàn. Có một cuộc gọi 'thư viện (stringi)' bị thiếu. –
Kết quả của các ví dụ của bạn khác nhau. Có lẽ bạn nên đưa ra một ví dụ đơn giản và giải thích những gì bạn muốn xảy ra trong các trường hợp góc. (Giá trị trong col1 không khớp, giá trị trong col2 không phù hợp và khả năng khớp nhiều) Ngoài ra, sẽ hữu ích khi biết nếu có một số ràng buộc về giá trị. – bluefish
Tôi kiểm tra nó bằng 'instr' nhưng nó chậm hơn so với' on ... like ... '. Bây giờ tôi thêm thư viện và thay đổi bên trái tham gia để tham gia bên trong để làm cho kết quả giống nhau. – Kacper