2014-01-27 2 views
0

도움이 필요한 성능 문제가 있습니다. 설명 나와 함께하시기 바랍니다 곰 :문자열 일치의 속도와 속도를 가속화하십시오.

을 내가 (쉽게 표시의 처음 4 개 라인 ~ 5000) 알려진 자동차 빈 번호와 년의 데이터베이스를 가지고 : 나는 또한 AA가 .txt 문서가

>vinDB 
>ToyotaCarola 2008 
IJDINJNDJIJKNDJIMKDK0897 
NissanAltima 1998 
LJIODJJNJDJNJDNJNJDJ7765 

을 즉 고유 DMV ID, 입력 전압 번호 및 다음과 같은 방법으로 참조 번호를 보여줍니다 (만 4 라인 ~ 5500 만은 쉽게 표시) : 나는 모든 두 번째 줄을 스캔하면됩니다 싶습니다 무엇

>carFile 
>#DMVcorrNumber33:1245638:563892:6378 
IJDINJNDJIJKNDJIMKDK0897 
+ 
VIN#IDref6388546 
#DMVcorrNumber33:1245638:563892:6378 
LJIODJJNJDJNJDNJNJDJ7765 
+ 
VIN#IDref2453663 

(VIN #)을 내 'vinDB'파일에서 내 'carFile'fi의 두 번째 줄부터 네 번째 줄까지 완벽한 경기를 위해 르. 일치하는 것이 있다면, 나는 car의 이름을 출력하고, 'carFile'파일에 몇 번이나 나타나는지 보여주고 싶습니다.

그래서 기본적으로, 나는이 필요합니다 지금까지 내가 잘린 'carFile'파일에 작동하지만, 내 R 프로그램을 충돌 다음 코드를 시도 할 때

Car   Year  NumTimesFound 
ToyotaCarola  2008   238 
NissanAltima  1998   1755 

그것은 모든 ~ 5500 만 라인 : quicked보다 효율적 위에

1) 코드를 확인하십시오

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 
} 

} 

그래서, 기본적으로, 나는 어떻게 파악하고 싶습니다.

2) 내 출력을 .txt 또는 .csv 파일에 저장하는 방법 (지금은 출력이 화면에 표시되기 때문에).

감사합니다.

답변

4

당신은 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  

J(car.vins)과 우리가 일치하도록 빈스와 함께 하나 개의 컬럼 data.table를 만들 이해 할 점을 (Jdata.table 단지 속기, 너무 오래입니다 data.table 내에서 사용함). 그 data.tabledt 안에 사용하면, 우리는 이전 단계에서 "vin.vins"로 dt을 키 입력했기 때문에 vins의 목록에 자동차 목록을 등록합니다. 마지막 인수는 결합 된 집합을 vin.names으로 그룹화하고 중간 인수는 각 그룹에 대해 .N (.N은 특별한 data.table 변수 임) 인스턴스의 수를 알고 싶다고합니다.

또한 이것을 실행하기 위해 일부 정크 데이터를 만들었습니다. 앞으로 이와 같은 데이터를 제공하십시오.

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

대단히 감사합니다. 나는 'data.table'의 힘을 한 번에 그리고 모두 배울 필요가있다. 다시 한 번 감사드립니다! –

관련 문제