수색…


소개

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 의 경우 조합 수가 너무 많아지는 것을주의하는 것이 중요합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow