String 提高R中字符串匹配的性能和速度
我有一个性能问题需要帮助。请接受我的解释: 我有一个已知汽车Vin和年份的数据库(为了方便起见,仅显示了~5000的前4行): 我还有一个.txt文档,它以以下方式显示了唯一的DMV ID、vin编号和参考号(仅显示了4行~5500万,以方便查看): 我想做的是,从我的“vinDB”文件中每隔第二行(VIN#)扫描一次,然后从我的“carFile”文件的每第四行(从第二行开始)扫描一次,以获得完美的匹配。如果匹配存在,我想输出汽车的名称,以及它在“carFile”文件中出现的次数 所以基本上,我需要这个:String 提高R中字符串匹配的性能和速度,string,r,performance,String,R,Performance,我有一个性能问题需要帮助。请接受我的解释: 我有一个已知汽车Vin和年份的数据库(为了方便起见,仅显示了~5000的前4行): 我还有一个.txt文档,它以以下方式显示了唯一的DMV ID、vin编号和参考号(仅显示了4行~5500万,以方便查看): 我想做的是,从我的“vinDB”文件中每隔第二行(VIN#)扫描一次,然后从我的“carFile”文件的每第四行(从第二行开始)扫描一次,以获得完美的匹配。如果匹配存在,我想输出汽车的名称,以及它在“carFile”文件中出现的次数 所以基本上,我
Car Year NumTimesFound
ToyotaCarola 2008 238
NissanAltima 1998 1755
到目前为止,我有以下代码,可以在一个被截断的“carFile”文件上运行,但当我尝试时,会使我的R程序崩溃,这将导致大约5500万行代码:
VinCounter<-function(carFile, vinDB)
{
i=1 #index inner while loop
j=1 #index outer while loop
m=2 #index of vinDB, starts at '2' because first VIN# is on line 2
s=2 #index of carFile
count=0
while(j<=length(rownames(vinDB))/2) # VIN# is on every 2nd line in vinDB file
{
while(i<=length(rownames(carFile))/4)# VIN# is on every 4th line in carFile file
{
if(vinDB[m,1]==carFile[s,1])
{
count=count+1
s=s+4
}
else
{
s=s+4
}
i=i+1
}
print(vinDB[m-1,1])
print(count)
count=0
s=2
i=1
m=m+2
j=j+1
}
}
VinCounter您可以相对轻松地使用数据完成此操作。表
:
vin.names <- vinDB[seq(1, nrow(vinDB), 2), ]
vin.vins <- vinDB[seq(2, nrow(vinDB), 2), ]
car.vins <- carFile[seq(2, nrow(carFile), 4), ]
library(data.table)
dt <- data.table(vin.names, vin.vins, key="vin.vins")
dt[J(car.vins), list(NumTimesFound=.N), by=vin.names]
# vin.names NumTimesFound
# 1: Ford 2014 15
# 2: Chrysler 1998 10
# 3: GM 1998 9
# 4: Ford 1998 11
# 5: Toyota 2000 12
# ---
# 75: Toyota 2007 7
# 76: Chrysler 1995 4
# 77: Toyota 2010 5
# 78: Toyota 2008 1
# 79: GM 1997 5
使用数据可以相对轻松地执行此操作。表
:
vin.names <- vinDB[seq(1, nrow(vinDB), 2), ]
vin.vins <- vinDB[seq(2, nrow(vinDB), 2), ]
car.vins <- carFile[seq(2, nrow(carFile), 4), ]
library(data.table)
dt <- data.table(vin.names, vin.vins, key="vin.vins")
dt[J(car.vins), list(NumTimesFound=.N), by=vin.names]
# vin.names NumTimesFound
# 1: Ford 2014 15
# 2: Chrysler 1998 10
# 3: GM 1998 9
# 4: Ford 1998 11
# 5: Toyota 2000 12
# ---
# 75: Toyota 2007 7
# 76: Chrysler 1995 4
# 77: Toyota 2010 5
# 78: Toyota 2008 1
# 79: GM 1997 5
非常感谢你!我需要一劳永逸地学习“data.table”的威力。再次感谢!非常感谢你!我需要一劳永逸地学习“data.table”的威力。再次感谢!
vin.names <- vinDB[seq(1, nrow(vinDB), 2), ]
vin.vins <- vinDB[seq(2, nrow(vinDB), 2), ]
car.vins <- carFile[seq(2, nrow(carFile), 4), ]
library(data.table)
dt <- data.table(vin.names, vin.vins, key="vin.vins")
dt[J(car.vins), list(NumTimesFound=.N), by=vin.names]
# vin.names NumTimesFound
# 1: Ford 2014 15
# 2: Chrysler 1998 10
# 3: GM 1998 9
# 4: Ford 1998 11
# 5: Toyota 2000 12
# ---
# 75: Toyota 2007 7
# 76: Chrysler 1995 4
# 77: Toyota 2010 5
# 78: Toyota 2008 1
# 79: GM 1997 5
set.seed(1)
makes <- c("Toyota", "Ford", "GM", "Chrysler")
years <- 1995:2014
cars <- paste(sample(makes, 500, rep=T), sample(years, 500, rep=T))
vins <- unlist(replicate(500, paste0(sample(LETTERS, 16), collapse="")))
vinDB <- data.frame(c(cars, vins)[order(rep(1:500, 2))])
carFile <-
data.frame(
c(rep("junk", 1000), sample(vins, 1000, rep=T), rep("junk", 2000))[order(rep(1:1000, 4))]
)