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
내용과 예는를 참조하십시오 . set
include 의 단점은 i
행 번호 (이진 검색 없음) 여야하며 by
. 이러한 제한 set
을 통해 오버 헤드를 크게 줄일 수 있습니다.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
세트 "V1"
동안 열 set(DT, i, colVar, i)
열 이름에 포함 된 세트 colVar
(경우 예를 들어 변수를 colVar = "V1"
이전에 이루어졌다). 따옴표는 변수를 조회하는 대신 열 이름을 문자 그대로 사용함을 나타냅니다.