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


88

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

답변:


94

다음은 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

26
이 패키지를 개발해 주셔서 감사합니다. 이 패키지를 사용하기 위해 많은 코드를 수정할 것 같은 느낌 이 듭니다.
Iterator

1
자기가 (분명히있다 / 대답 질문에 채팅에 나는 질문을 받았다 격려를 ) - 그 질문은 여기
매트 Dowle

4
@MatthewDowle : =를 사용하지 않고 대신 set ()을 사용하는 경우에 대한 설명을 포함하고 싶습니까?
Ari B. Friedman

2
@MatthewDowle 할 수 있으면 다시 +1했습니다.
Ari B. Friedman

3
@jabberwocky 문제 없습니다. set(DT, i, "V1", i)세트 "V1"동안 열 set(DT, i, colVar, i)열 이름에 포함 된 세트 colVar(경우 예를 들어 변수를 colVar = "V1"이전에 이루어졌다). 따옴표는 변수를 조회하는 대신 열 이름을 문자 그대로 사용함을 나타냅니다.
Matt Dowle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.