在data.table中設(shè)置密鑰的目的是什么?我正在使用data.table,并且有許多功能需要我設(shè)置密鑰(例如X[Y])。因此,我希望了解密鑰在我的數(shù)據(jù)表中正確設(shè)置密鑰的作用。我讀過的一個來源是?setkey。setkey()對a data.table進行排序并將其標記為已排序。排序列是關(guān)鍵。密鑰可以是任何順序的任何列。列始終按升序排序。該表通過引用更改。除了臨時工作內(nèi)存大到一列之外,根本不會復(fù)制。我的理念是,一個鍵可以“排序”data.table,從而產(chǎn)生非常相似的效果order()。但是,它沒有解釋擁有密鑰的目的。data.table FAQ 3.2和3.3解釋了:3.2我沒有大桌子上的鑰匙,但分組仍然非常快。這是為什么?data.table使用基數(shù)排序。這明顯快于其他排序算法。Radix僅用于整數(shù),請參閱 ?base::sort.list(x,method="radix")。這也是setkey()快速的原因之一 。如果沒有設(shè)置密鑰,或者我們按照與密鑰不同的順序進行分組,我們稱之為ad hoc。3.3為什么密鑰中的列按比ad hoc更快的分組?因為每個組在RAM中是連續(xù)的,從而最小化頁面提取,并且可以批量復(fù)制內(nèi)存(memcpy在C中)而不是在C中循環(huán)。從這里開始,我想設(shè)置一個鍵以某種方式允許R使用“基數(shù)排序”而不是其他算法,這就是為什么它更快。10分鐘快速入門指南還有一個按鍵指南。按鍵讓我們從考慮data.frame,特別是rownames(或英文,行名)開始。也就是說,屬于單行的多個名稱。屬于單行的多個名稱?這不是我們在data.frame中習(xí)慣的。我們知道每行最多只有一個名稱。一個人至少有兩個名字,第一個名字和第二個名字。這對于組織電話目錄很有用,例如,按姓氏排序,然后是第一個名稱。但是,data.frame中的每一行只能有一個名稱。密鑰由一列或多列rownames組成,可以是整數(shù),因子,字符或其他類,而不僅僅是字符。此外,行按鍵排序。因此,data.table最多只能有一個鍵,因為它不能以多種方式排序。不強制執(zhí)行唯一性,即允許重復(fù)鍵值。由于行按鍵排序,因此鍵中的任何重復(fù)項都將連續(xù)出現(xiàn)電話簿有助于理解密鑰是什么,但與具有因子列相比,似乎密鑰沒有區(qū)別。此外,它沒有解釋為什么需要密鑰(特別是使用某些功能)以及如何選擇要設(shè)置為密鑰的列。此外,似乎在data.table中將time作為列,將任何其他列設(shè)置為鍵也可能會使時間列混亂,這使得它更加混亂,因為我不知道是否允許將任何其他列設(shè)置為鍵。有人可以開導(dǎo)我嗎?
- 2 回答
- 0 關(guān)注
- 725 瀏覽
添加回答
舉報
0/150
提交
取消