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