더북(TheBook)

반면 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배 빠르게 결과를 내놓는다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.