[r] data.table에서 : = 연산자를 언제 사용해야합니까?

data.table이제 객체에는 : = 연산자가 있습니다. 이 연산자가 다른 모든 할당 연산자와 다른 점은 무엇입니까? 또한 그 용도는 무엇이며 얼마나 빠르며 언제 피해야합니까?



답변

다음은 10 분을 1 초로 단축 한 예입니다 ( 홈페이지의 NEWS에서 ). a에 하위 할당하는 것과 같지만 data.frame매번 전체 테이블을 복사하지는 않습니다.

m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)

system.time(for (i in 1:1000) DF[i,1] <- i)
     user  system elapsed
  287.062 302.627 591.984

system.time(for (i in 1:1000) DT[i,V1:=i])
     user  system elapsed
    1.148   0.000   1.158     ( 511 times faster )

다음 :=j같이 넣으면 더 많은 관용구를 사용할 수 있습니다.

DT["a",done:=TRUE]   # binary search for group 'a' and set a flag
DT[,newcol:=42]      # add a new column by reference (no copy of existing data)
DT[,col:=NULL]       # remove a column by reference

및 :

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group

나는 피해야 할 이유를 생각할 수 없다 :=! for루프 내부를 제외하고 . :=내부 DT[...]에 나타나기 때문에 [.data.table메서드 의 약간의 오버 헤드가 있습니다 . 예를 들어, S3 디스패치와 같은 인자의 존재 및 타입을 검사 i, by, nomatch인사이드 용 등에 따라서 for루프는 낮은 오버 헤드를 직접 버전이 :=호출 set. 자세한 ?set내용과 예는를 참조하십시오 . setinclude 의 단점은 i행 번호 (이진 검색 없음) 여야하며 by. 이러한 제한 set을 통해 오버 헤드를 크게 줄일 수 있습니다.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed
    0.016   0.000   0.018


답변