R data.table - 快速比较字符串

时间:2018-03-23 09:52:53

标签: r data.table grepl

我想找到以下问题的快速解决方案。 这个例子很小,实际数据很大,而速度是一个重要因素。

我有两个字符串向量,目前在data.tables中,但这并不重要。我需要在第二个向量中找到一个向量的字符串出现频率并保留这些结果。

实施例

library(data.table)

dt1<-data.table(c("first","second","third"),c(0,0,0))
dt2<-data.table(c("first and second","third and fifth","second and no else","first and second and third"))

现在,对于dt1中的每个项目,我需要找到包含dt2的项目数量,并将最终频率保存到dt1的第二列。 任务本身并不困难。但是,我没有找到合理快速的解决方案。

我现在的解决方案是:

pm<-proc.time()
for (l in 1:dim(dt2)[1]) {
    for (k in 1:dim(dt1)[1]) set(dt1,k,2L,dt1[k,V2]+as.integer(grepl(dt1[k,V1],dt2[l,V1])))
}
proc.time() - pm

真实数据非常大,这在我的电脑上很慢,即使这个较大的版本需要2秒

dt1<-data.table(rep(c("first","second","third"),10),rep(c(0,0,0),10))
dt2<-data.table(rep(c("first and second","third and fifth","second and no else","first and second and third"),10))

pm<-proc.time()
for (l in 1:dim(dt2)[1]) {
    for (k in 1:dim(dt1)[1]) set(dt1,k,2L,dt1[k,V2]+as.integer(grepl(dt1[k,V1],dt2[l,V1])))
}
proc.time() - pm

   user  system elapsed 
   1.93    0.06    2.06 

我是否会错过更好的解决方案 - 我会说非常简单 - 任务? 实际上它很简单,我确信它必须是重复的,但我没有设法在这里找到它或任何等效的。

由于内存问题(在实际情况下),无法交叉合并data.tables。 谢谢。

1 个答案:

答案 0 :(得分:1)

dt1[, V2 := sapply(V1, function(x) sum(grepl(x, dt2$V1)))]

您也可以使用固定字符串匹配来提高速度。 在这种情况下,您可以使用stri_detect_fixed包中的stringi

dt1[, V2 := sapply(V1, function(x) sum(stri_detect_fixed(dt2$V1, x)))]