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