Я понимаю из превосходных ресурсов здесь , здесь и здесь , что data.table
использует автоматическое индексирование c (для создания key
, то есть с наддувом имена строк) и подмножество бинарного поиска в отличие от tidyverse
, которое опирается на векторное сканирование.
Я понимаю, что векторное сканирование требует сканирования каждой отдельной строки и создания логических векторов длиной nrow(dataset)
, и что повторять это не так эффективно.
Мне интересно, может ли кто-нибудь помочь мне точно сформулировать, как эти два метода означают, что data.table
операции выполняются намного быстрее по сравнению с tidyverse
, когда вам нужно сгруппировать по переменной. То есть это потому, что data.table
автоматически индексирует столбец group_by
и разбивает его на сгруппированные подмножества и выполняет операции для каждого подмножества, в то время как метод векторного сканирования потребует генерации n = unique groups
нескольких логических векторов, а затем запускает операции на каждый отдельный логический вектор, перед сопоставлением результатов?
Кроме того, согласно data.table
виньетка ,
Мы можем установить ключи в нескольких столбцах, причем столбцы могут быть разных типов ...
Поскольку строки переупорядочиваются, таблица данных может содержать не более одного ключа, поскольку ее нельзя отсортировать более чем одним способом.
Что означает, что мы можем установить ключи для нескольких столбцов, и все же data.table
может иметь не более одного ключа? Т.е. в любой момент при выполнении операции есть только один ссылочный ключ, но в каком столбце задан ссылочный ключ, который может измениться, когда мы перейдем к другому компоненту всей операции?
Спасибо за заранее!