반면 DT2[DT1, ]는 260,000개 행을 DT2로부터 검색하되 DT2에 대응하는 행이 없는 경우 z에 NA가 포함된 행이 반환된다. 따라서 그 결과는 총 260,000행이다.
> setkey(DT2, y) # DT2에서의 검색을 빠르게 수행하기 위해 색인 생성 > DT2[DT1, ] y z x 1: A a 0.36912925 2: A a 0.60170742 3: A a 0.16972871 4: A a 0.27251097 5: A a 0.96946385 --- 259996: Z NA 0.04522689 259997: Z NA 0.50320326 259998: Z NA 0.01764672 259999: Z NA 0.51967080 260000: Z NA 0.78829015
데이터 테이블 간의 병합은 색인을 활용하므로 그 속도가 빠르다. 또 데이터 테이블 병합 시 DT1[DT2, 표현식]과 같이 얻고자 하는 결과의 표현식을 바로 지정할 수 있으므로, 데이터 병합과 동시에 계산을 수행할 수 있는 장점이 있다.
편리해 보이기는 하지만 데이터 프레임과 merge( )를 사용해도 같은 결과를 얻을 수 있지 않을까? 물론 merge( )를 사용해서도 같은 결과를 얻을 수 있다. 그러나 데이터 테이블이 제공하는 테이블 병합 방식의 장점은 속도에 있다. 다음은 DT1[DT2, ]와 이를 데이터 프레임으로 수행했을 때의 코드 수행 시간을 비교한 예다.
> DT1 <- data.table(x=runif(260000), y=rep(LETTERS, each=10000)) > DT2 <- data.table(y=c("A", "B", "C"), z=c("a", "b", "c")) > setkey(DT1, y) > system.time(DT1[DT2, ]) user system elapsed 0.002 0.001 0.005 > DF1 <- as.data.frame(DT1) > DF2 <- as.data.frame(DT2) > system.time(merge(DF1, DF2)) user system elapsed 0.102 0.010 0.112
30,000행의 출력을 만드는 데 데이터 테이블은 총 0.005초가 소요되었고, 데이터 프레임은 0.112초가 소요되었다. 즉, 데이터 테이블이 20배 빠르게 결과를 내놓는다.