Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 提高R中字符串匹配的性能和速度_String_R_Performance - Fatal编程技术网

String 提高R中字符串匹配的性能和速度

String 提高R中字符串匹配的性能和速度,string,r,performance,String,R,Performance,我有一个性能问题需要帮助。请接受我的解释: 我有一个已知汽车Vin和年份的数据库(为了方便起见,仅显示了~5000的前4行): 我还有一个.txt文档,它以以下方式显示了唯一的DMV ID、vin编号和参考号(仅显示了4行~5500万,以方便查看): 我想做的是,从我的“vinDB”文件中每隔第二行(VIN#)扫描一次,然后从我的“carFile”文件的每第四行(从第二行开始)扫描一次,以获得完美的匹配。如果匹配存在,我想输出汽车的名称,以及它在“carFile”文件中出现的次数 所以基本上,我

我有一个性能问题需要帮助。请接受我的解释:

我有一个已知汽车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))]
  )