gpt4 book ai didi

R 在 like/grep 条件下加入

转载 作者:行者123 更新时间:2023-12-04 01:14:12 24 4
gpt4 key购买 nike

我正在寻找使用 grep/like/stri_detect 条件在字符列上连接 2 个 data.frames/data.tables 的有效方法。

我可以将 sqldf 包与 join on like 一起使用,但速度很慢。在我的 2 个 data.tables(5k 行,20k 行)上,大约需要 60 秒。

我的第二种方法是使用 data.table 中的 CJ,然后在 2 列上使用 stri_detect_fixed。这种方法更快(16 秒),但我担心随着数据的增长将无法使用(它显着增加了 ram 的使用)。

我也尝试在 for 循环中进行,但它是最慢的。

有什么办法可以更快地做到这一点,尤其是在 data.table 中?

下面我粘贴我的例子:

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)])

最佳答案

sqldf对于您的示例数据,方法在我的机器上是最快的,但这里有一个更快的 data.table版本以防万一。

library(data.table)
library(sqldf)

## Example data
v1 <- paste0(c("asdasd asdasd 768jjhknmnmnj", "78967ggh","kl00896754","kl008jku"),
1:10000)
v2 <- paste0(c("mnj", "12345","kl008","lll1"), 1:10000)

data1 <- data.table(col1=v1, key="col1")
data2 <- data.table(col2=v2, key="col2")


## sqldf version
system.time(
ans1 <- data.table(sqldf(
"select *
from data1 a inner join data2 b
on instr(a.col1, b.col2)", drv="SQLite"))
)

## user system elapsed
## 17.579 0.036 17.654


## parallelized data.table version
suppressMessages(library(foreach)); suppressMessages(library(doParallel))
cores <- detectCores() ## I've got 4...
clust <- makeForkCluster(cores)
registerDoParallel(clust)

system.time({
batches <- cores
data2[, group:=sort(rep_len(1:batches, nrow(data2)))]
ans2 <- foreach(
i=1:batches, .combine=function(...) rbindlist(list(...)),
.multicombine=TRUE, .inorder=FALSE) %dopar% {
CJ(col1=data1[, col1], col2=data2[group==i, col2])[,
alike:=col1 %like% col2, by=col2][
alike==TRUE][, alike:=NULL][]
}
})

## user system elapsed
## 0.185 0.229 30.295

stopCluster(clust)
stopImplicitCluster()

我在 OSX 上运行它——您可能需要调整其他操作系统的并行化代码。此外,如果您的实际数据更大并且内存不足,您可以尝试更大的 batches值。

关于R 在 like/grep 条件下加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36011205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com