data.table
키와 인덱스 사용하기
수색…
소개
비고
공식 비네팅은이 주제에 대한 최고의 소개입니다 :
키 대 인덱스
data.table은 일련의 열에 의해 "키잉 (keyed)"될 수 있으며 관심있는 함수에 해당 열로 데이터가 정렬되었음을 알립니다. 키를 가져 오거나 설정하려면 ?key
설명 된 기능을 사용하십시오.
마찬가지로, 함수는 data.table의 "인덱스"를 이용할 수 있습니다. 각 인덱스와 테이블에는 둘 이상이있을 수 있습니다. 열 순서와 관련하여 데이터 순서에 대한 정보를 저장합니다. 키와 마찬가지로 인덱스는 특정 작업의 속도를 높일 수 있습니다. 인덱스를 가져 오거나 설정하려면 ?indices
설명 된 함수를 사용하십시오.
인덱스는 자동으로 설정 될 수도 있습니다 (현재는 한 번에 하나의 열에 대해서만). 이것이 작동하는 방법과 필요한 경우 비활성화하는 방법에 대한 자세한 내용은 ?datatable.optimize
를 참조하십시오.
확인 및 업데이트
누락 된 값은 키 열에 허용됩니다.
키와 인덱스는 속성으로 저장되며 실수로 테이블의 실제 데이터 순서와 일치하지 않을 수 있습니다. 많은 함수가 키 또는 인덱스를 사용하기 전에 키 또는 인덱스의 유효성을 확인하지만이를 염두에 두는 것이 좋습니다.
키와 인덱스는 정렬 순서가 유지되는 것이 명확하지 않은 업데이트 후에 제거됩니다. 예를 들어 DT = data.table(a=c(1,2,4), key="a")
에서 시작 DT = data.table(a=c(1,2,4), key="a")
DT[2, a := 3]
처럼 업데이트하면 키가 손상됩니다.
하위 집합 선택 성능 향상
# example data
set.seed(1)
n = 1e7
ng = 1e4
DT = data.table(
g1 = sample(ng, n, replace=TRUE),
g2 = sample(ng, n, replace=TRUE),
v = rnorm(n)
)
하나의 열에 매치
==
또는 %in%
로 하위 집합 연산을 처음 실행 한 후 ...
system.time(
DT[ g1 %in% 1:100]
)
# user system elapsed
# 0.12 0.03 0.16
g1
대해 인덱스가 자동으로 생성되었습니다. 후속 하위 집합 작업은 거의 즉시 실행됩니다.
system.time(
DT[ g1 %in% 1:100]
)
# user system elapsed
# 0 0 0
인덱스가 생성되거나 사용될 때를 모니터하려면 verbose=TRUE
옵션을 추가하거나 글로벌 설정 options(datatable.verbose=TRUE)
변경하십시오.
여러 열의 일치
현재 두 열의 일치는 자동으로 색인을 생성하지 않습니다.
system.time(
DT[ g1 %in% 1:100 & g2 %in% 1:100]
)
# user system elapsed
# 0.57 0.00 0.57
다시 실행하면 느려질 것입니다. setindex(DT, g1, g2)
하여 인덱스를 수동으로 추가 setindex(DT, g1, g2)
쿼리가 패키지에 의해 아직 최적화되지 않았기 때문에 느리게 유지됩니다.
다행스럽게도 우리가 검색하고자하는 값의 조합과 인덱스를 열거 할 수 있다면 동등하게 조인 할 수 있습니다 :
system.time(
DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
# user system elapsed
# 0.53 0.00 0.54
setindex(DT, g1, g2)
system.time(
DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
# user system elapsed
# 0 0 0
CJ
의 경우 조합 수가 너무 많아지는 것을주의하는 것이 중요합니다.