Data.table kullanıyorum ve bir anahtar ayarlamamı gerektiren birçok işlev var (örneğin X[Y]
). Bu nedenle, veri tablolarımdaki anahtarları doğru şekilde ayarlamak için bir anahtarın ne yaptığını anlamak isterim.
Okuduğum kaynaklardan biri ?setkey
.
setkey()
a'yı sıralardata.table
ve sıralı olarak işaretler. Sıralanan sütunlar anahtardır. Anahtar, herhangi bir sıradaki herhangi bir sütun olabilir. Sütunlar her zaman artan sırada sıralanır. Tablo referans olarak değiştirilir. Bir sütun büyüklüğündeki geçici çalışma belleği dışında hiçbir şekilde kopyalama yapılmaz.
Buradaki çıkarım, bir anahtarın data.table'ı "sıralaması" ve sonuçta çok benzer bir etki yaratmasıdır order()
. Ancak, bir anahtara sahip olmanın amacını açıklamıyor.
Data.table SSS 3.2 ve 3.3 şunları açıklar:
3.2 Büyük bir masada anahtarım yok, ancak gruplama hala çok hızlı. Neden?
data.table, radix sıralama kullanır. Bu, diğer sıralama algoritmalarından önemli ölçüde daha hızlıdır. Radix yalnızca tamsayılar içindir, bkz
?base::sort.list(x,method="radix")
. Bu aynı zamandasetkey()
hızlı olmasının bir nedenidir . Anahtar ayarlanmadığında veya anahtardan farklı bir sırada grupladığımızda, buna ad hoc diyoruz.3.3 Neden anahtardaki sütunlara göre gruplama geçici bir yöntemden daha hızlıdır?
Her grup RAM'de bitişik olduğundan, böylece sayfa getirmeleri en aza indirilir ve bellek
memcpy
C'de döngü yapmak yerine toplu olarak ( C olarak) kopyalanabilir .
Buradan, bir anahtar ayarlamanın bir şekilde R'nin diğer algoritmalara göre "taban sıralaması" kullanmasına izin verdiğini ve bu yüzden daha hızlı olduğunu tahmin ediyorum.
10 dakikalık hızlı başlangıç kılavuzu ayrıca tuşlarla ilgili bir kılavuza da sahiptir.
- Anahtarlar
Data.frame, özel olarak satır adları (veya İngilizce satır adlarını) düşünerek başlayalım. Yani, tek bir satıra ait birden çok isim. Tek satıra ait birden fazla isim? Data.frame'de alıştığımız şey bu değil. Her satırın en fazla bir adı olduğunu biliyoruz. Bir kişinin en az iki adı vardır, ilk adı ve ikinci adı. Bu, örneğin soyadına ve ardından ilk ada göre sıralanmış bir telefon rehberi düzenlemek için kullanışlıdır. Ancak, data.frame'deki her satırın yalnızca bir adı olabilir.
Bir anahtar, yalnızca karakterden değil, tam sayı, faktör, karakter veya başka bir sınıf olabilen bir veya daha fazla satır adı sütunundan oluşur. Ayrıca, satırlar anahtara göre sıralanır. Bu nedenle, bir data.table birden fazla şekilde sıralanamayacağı için en fazla bir anahtara sahip olabilir.
Benzersizlik zorunlu kılınmaz, yani yinelenen anahtar değerlerine izin verilir. Satırlar anahtara göre sıralandığından, anahtardaki kopyalar art arda görünecektir
Telefon rehberi, bir anahtarın ne olduğunu anlamada yardımcı oldu, ancak bir anahtarın bir faktör sütununa sahip olmaktan farklı olmadığı görülüyor. Ayrıca, neden bir anahtarın gerekli olduğunu (özellikle belirli işlevleri kullanmak için) ve anahtar olarak ayarlanacak sütunun nasıl seçileceğini açıklamaz. Ayrıca, bir sütun olarak zaman içeren bir data.table'da, başka herhangi bir sütunu anahtar olarak ayarlamak muhtemelen zaman sütununu da bozacak gibi görünüyor, bu da başka bir sütunu olarak ayarlamama izin verilip verilmediğini bilmediğim için daha da kafa karıştırıcı hale getiriyor. tuşuna basın. Biri beni aydınlatabilir mi lütfen?