data.table을 사용하고 있으며 키를 설정해야하는 많은 기능이 있습니다 (예 :) X[Y]
. 따라서 데이터 테이블에서 키를 올바르게 설정하기 위해 키가 수행하는 작업을 이해하고 싶습니다.
내가 읽은 한 출처는 ?setkey
.
setkey()
a를 정렬하고 정렬 된 것으로data.table
표시합니다. 정렬 된 열이 핵심입니다. 키는 순서에 관계없이 모든 열이 될 수 있습니다. 열은 항상 오름차순으로 정렬됩니다. 표는 참조로 변경됩니다. 하나의 열만큼 큰 임시 작업 메모리 외에는 복사가 전혀 이루어지지 않습니다.
여기서 내 요점은 키가 data.table을 "정렬"하여 order()
. 그러나 키를 갖는 목적을 설명하지 않습니다.
data.table FAQ 3.2 및 3.3은 다음을 설명합니다.
3.2 큰 테이블에는 키가 없지만 그룹화는 여전히 매우 빠릅니다. 왜 그런 겁니까?
data.table은 기수 정렬을 사용합니다. 이것은 다른 정렬 알고리즘보다 훨씬 빠릅니다. 기수는 특히 정수 전용
?base::sort.list(x,method="radix")
입니다.을 참조하십시오 . 이것은 또한setkey()
빠른 이유 중 하나 입니다. 키가 설정되지 않았거나 키의 순서와 다른 순서로 그룹화하는 경우이를 임시 기준이라고합니다.3.3 키의 열을 기준으로 그룹화하는 것이 임시 기준보다 빠른 이유는 무엇입니까?
각 그룹은 RAM에서 연속적이므로 페이지 가져 오기를 최소화하고 메모리
memcpy
를 C에서 반복하는 대신 대량으로 ( C에서) 복사 할 수 있기 때문입니다.
여기에서 키를 설정하면 R이 다른 알고리즘보다 "기수 정렬"을 사용할 수 있다고 생각하고 이것이 더 빠른 이유입니다.
10 분 빠른 시작 가이드에는 키에 대한 가이드도 있습니다.
- 키
data.frame, 특히 행 이름 (또는 영어로 된 행 이름)을 고려하여 시작하겠습니다. 즉, 단일 행에 속하는 여러 이름입니다. 단일 행에 속하는 여러 이름? 그것은 우리가 data.frame에서 익숙한 것이 아닙니다. 각 행에는 최대 하나의 이름이 있다는 것을 알고 있습니다. 사람은 적어도 두 개의 이름, 첫 번째 이름과 두 번째 이름을 가지고 있습니다. 예를 들어 성, 이름 순으로 정렬되는 전화 번호부를 구성하는 데 유용합니다. 그러나 data.frame의 각 행은 하나의 이름 만 가질 수 있습니다.
키는 단순히 문자가 아닌 정수, 인수, 문자 또는 기타 클래스 일 수있는 하나 이상의 행 이름 열로 구성됩니다. 또한 행은 키별로 정렬됩니다. 따라서 data.table은 여러 가지 방법으로 정렬 할 수 없기 때문에 최대 하나의 키를 가질 수 있습니다.
고유성이 적용되지 않습니다. 즉, 중복 키 값이 허용됩니다. 행이 키별로 정렬되어 있으므로 키의 중복 항목이 연속적으로 나타납니다.
전화 번호부는 키가 무엇인지 이해하는 데 도움이되었지만 요소 열이있는 것과 비교할 때 키가 다르지 않은 것 같습니다. 또한 키가 필요한 이유 (특히 특정 기능 사용)와 키로 설정할 열을 선택하는 방법에 대해서는 설명하지 않습니다. 또한 시간을 열로 설정하는 data.table에서 다른 열을 키로 설정하면 시간 열도 엉망이 될 것이므로 다른 열을 키. 누군가 제발 나를 깨달을 수 있습니까?