Data.table - setkey (...) создает индекс или физически переупорядочивает строки в таблице данных?

Этот (очень простой) вопрос является результатом обмена здесь.

В документации для setkey() указано:

setkey() сортирует таблицу data.table и маркирует ее как отсортированную. Сортированные столбцы являются ключом. Ключ может быть любым столбцом в любом порядке. Столбцы сортируются в порядке возрастания всегда. Таблица изменена на ссылка... (выделено мной)

Я всегда интерпретировал это как означающее, что setkey() создает индекс, а не физически перестраивает строки таблицы данных (подобно индексированию таблицы базы данных). Но если это верно, то удаление ключа (с помощью setkey(DT,NULL)) должно удалить индекс и восстановить таблицу данных в исходный, несортированный порядок. Это не то, что происходит:

library(data.table)
DT <- data.table(a=3:1, b=1:3, c=5:7); DT
   a b c
1: 3 1 5
2: 2 2 6
3: 1 3 7
setkey(DT,a); DT
   a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5
setkey(DT,NULL)
   a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5

Итак, два вопроса:

1: Если строки перегруппированы (отсортированы), значит, что означает "изменение по ссылке"?

2: Что делает setkey(DT,NULL) точно?

Ответ 1

  • Строки сортируются. "Изменено по ссылке" здесь означает, что копирование всей таблицы не производится, а строки просто заменены.

  • setkey(DT, NULL) эквивалентен setattr(DT, "sorted", NULL). Он просто отключает атрибут "отсортированный".