我有一个关于数据集中两个字符串的子字符串之间非常快速有效的比较的问题,尽管机器非常强大,但它的运行速度不够快。我有data.table2 列和大约 15 亿行,其结构如下:
library(data.table)
library(stringr)
library(stringi)
library(stringdist)
dt <- data.frame(c("002134", "024345", "176234"), c("002003", "024234", "002004"))
colnames(dt) <- c("class1", "class2")
setDT(dt)
Run Code Online (Sandbox Code Playgroud)
我想要的是一个函数,它 (1) 从两个向量的每个字符串中逐行提取前 3 位数字,(2) 比较两个向量之间的子字符串,(3) 创建一个新的布尔变量来报告两个子字符串是否相同是否相等。
所以想要的结果如下:
dt$sameclass <- c(TRUE, TRUE, FALSE)
print(dt)
class1 class2 sameclass
1: 002134 002003 TRUE
2: 024345 024234 TRUE
3: 176234 002004 FALSE
Run Code Online (Sandbox Code Playgroud)
我已经尝试过stringr和的版本,stringi无论是在data.table功能内还是在功能外。为了比较我使用的子字符串stringdist,因为据我了解可以并行化,这对我的服务器非常有益。然而,瓶颈似乎仍然是子串提取。
#stringi + stringdist without data.table:
dt$redclass1 <- stri_sub(dt$class1, to = 3)
dt$redclass2 <- stri_sub(dt$class2, to = 3)
dt[, classdist …Run Code Online (Sandbox Code Playgroud)