Я использую data.table, и есть много функций, которые требуют от меня установить ключ (например, X[Y]
). Таким образом, я хочу понять, что делает ключ, чтобы правильно устанавливать ключи в моих таблицах данных.
Один источник, который я прочитал, был ?setkey
.
setkey()
сортирует adata.table
и отмечает его как отсортированный. Сортированные столбцы - это ключ. Ключ может быть любым столбцом в любом порядке. Колонки сортируются в порядке возрастания всегда. Таблица изменяется по ссылке. Никакой копии не делается вообще, кроме временной рабочей памяти размером не более одного столбца.
Мой взнос здесь заключается в том, что ключ "сортирует" таблицу данных, что приводит к очень похожему эффекту на order()
. Тем не менее, это не объясняет назначение ключа.
В Таблицах данных 3.2 и 3.3 объясняется:
3.2 У меня нет ключа на большой таблице, но группировка по-прежнему очень быстрая. Почему это?
data.table использует сортировку radix. Это значительно быстрее, чем другие алгоритмы сортировки. Radix специально предназначен для целых чисел, см.
?base::sort.list(x,method="radix")
. Это также одна из причин, почемуsetkey()
Быстро. Когда ключ не установлен, или мы группируем в другом порядке от ключа, мы называем его ad hoc by.3.3 Почему группировка по столбцам в ключе быстрее, чем ad hoc?
Поскольку каждая группа смежна в ОЗУ, тем самым сводя к минимуму страницу выборки и память могут быть скопированы навалом (
memcpy
в C), а не цикл в C.
Отсюда, я полагаю, что установка ключа каким-то образом позволяет R использовать "сортировку радиуса" по сравнению с другими алгоритмами, и почему это происходит быстрее.
10-минутное руководство по быстрому запуску также содержит руководство по клавишам.
- Клавиши
Давайте начнем с рассмотрения data.frame, specically rownames (или в Английский, имена строк). То есть, несколько имен, принадлежащих одному ряд. Несколько имен, принадлежащих к одной строке? Это не то, что мы привыкли в data.frame. Мы знаем, что каждая строка имеет не более одного имя. У человека есть как минимум два имени, первое имя и второе имя. Это полезно для организации телефонного справочника, например, который сортируется по фамилии, затем первому имени. Однако каждая строка в data.frame может иметь только одно имя.
Ключ состоит из одного или нескольких столбцы имен розеток, которые могут быть целыми, множителями, символами или некоторыми другой класс, а не просто характер. Кроме того, строки сортируются по ключ. Поэтому таблица данных может иметь не более одного ключа, поскольку не могут быть отсортированы более чем одним способом.
Уникальность не применяется, то есть допускаются повторяющиеся значения ключа. Поскольку строки сортируются по ключ, любые дубликаты в ключе будут отображаться последовательно
Телефонный справочник был полезен для понимания того, что такое ключ, но кажется, что ключ не отличается по сравнению с наличием столбца факторов. Кроме того, он не объясняет, почему нужен ключ (особенно для использования определенных функций) и как выбрать столбец для установки в качестве ключа. Кроме того, похоже, что в таблице данных со временем в качестве столбца установка любого другого столбца в качестве ключа, вероятно, испортит также столбец времени, что делает его еще более запутанным, поскольку я не знаю, разрешено ли мне устанавливать любой другой столбец как ключ. Может кто-нибудь просветить меня, пожалуйста?