Я використовую data.table і є багато функцій, які вимагають від мене встановити ключ (наприклад X[Y]
). Тому я хочу зрозуміти, що робить ключ, щоб правильно встановити ключі в моїх таблицях даних.
Одне я читав джерело ?setkey
.
setkey()
сортує аdata.table
та позначає як відсортовану. Впорядковані стовпці є ключовими. Ключем можуть бути будь-які стовпці в будь-якому порядку. Стовпці завжди сортуються у порядку зростання. Таблиця змінюється за посиланням. Жодна копія не робиться, окрім тимчасової робочої пам'яті, розміром якої є один стовпець.
Моє вирішення тут полягає в тому, що ключ "сортувати" таблицю даних. Це призведе до дуже схожого ефекту order()
. Однак це не пояснює мету мати ключ.
Поширені питання 3.2. та 3.3 пояснюють:
3.2 У мене немає ключа на великому столі, але групування все ще дуже швидко. Чому так?
data.table використовує радіаційне сортування. Це значно швидше, ніж інші алгоритми сортування. Див
?base::sort.list(x,method="radix")
. Radix спеціально для цілих чисел, див . Це також одна з причин, чомуsetkey()
це швидко. Якщо ключ не встановлений, або ми групуємо в іншому порядку, ніж ключ, ми називаємо це ad hoc by.3.3 Чому групування за стовпцями у ключі швидше, ніж спеціальне?
Оскільки кожна група є суміжною в оперативній пам’яті, тим самим мінімізуючи кількість сторінок, і пам'ять може бути скопійована масово (
memcpy
в C), а не циклічно в C.
Звідси я здогадуюсь, що встановлення клавіші якось дозволяє R використовувати "радіаційне сортування" за іншими алгоритмами, і тому це швидше.
У 10-хвилинному швидкому путівнику також є інструкція по клавішах.
- Ключі
Почнемо з розгляду data.frame, спеціально назви рядків (або англійською мовою, назви рядків). Тобто кілька імен, що належать до одного ряду. Кілька імен, що належать до одного ряду? Це не те, до чого ми звикли в data.frame. Ми знаємо, що кожен рядок має щонайменше одне ім’я. Людина має щонайменше два імені, перше ім’я та друге ім’я. Це корисно, наприклад, організувати телефонний довідник, який сортується за прізвищем, а потім за першою назвою. Однак кожен рядок у data.frame може мати лише одне ім’я.
Ключ складається з одного або декількох стовпців імен рядків, які можуть бути цілим числом, фактором, символом чи іншим класом, а не просто символом. Крім того, рядки сортуються за ключем. Тому таблиця даних може мати щонайменше один ключ, оскільки його не можна сортувати більш ніж одним способом.
Унікальність не застосовується, тобто допускаються повторювані значення ключів. Оскільки рядки відсортовані за ключем, будь-які дублікати в ключі з’являться послідовно
Телефонний довідник був корисним для розуміння того, що таке ключ, але, здається, ключ не відрізняється від порівняння з факторною колоною. Крім того, він не пояснює, чому потрібен ключ (особливо для використання певних функцій) та як вибрати стовпець, який слід встановити як ключ. Крім того, здається, що в таблиці даних з часом у якості стовпця, встановлення будь-якого іншого стовпця як ключа, можливо, також зіпсує стовпець часу, що робить його ще більш заплутаним, оскільки я не знаю, чи мені дозволено встановити будь-який інший стовпець як ключ. Може хтось просвітить мене, будь ласка?