Kurs
Bu data.table R eğitimi, data.table paketinin çekirdeğinde yer alan DT[i, j, by] komutunun temelini açıklar. data.table paketi hakkında daha fazla bilgi edinmek isterseniz, DataCamp data.table paketi üzerine etkileşimli bir R kursu sunar. Kursta tarayıcınızın konforunda gerçekleştireceğiniz 35’ten fazla etkileşimli R alıştırması ve data.table paketinin ana yazarı Matt Dowle ile büyük katkı sağlayan Arun Srinivasan’ın yer aldığı birkaç video bulunur. Ücretsiz deneyin.
Daha önce RAM’de büyük veri kümeleriyle (1 GB’tan 100+ GB’a kadar) çalıştıysanız, bir data.frame’in sınırlayıcı olabileceğini biliyorsunuzdur: Bazı işlemler için gereken süre fazlasıyla uzundur. Data.table bunu hesaplama süresini azaltarak çözer. Dahası, daha az yazmayla daha fazlasını yapmayı da kolaylaştırır. Bu data.table R eğitiminden data.table sözdizimini öğrendiğinizde, karmaşık işlemleri yapmanın ne kadar basit olduğuna şaşıracaksınız. Böylece yalnızca hesaplama süresini değil, programlama süresini de kısaltacaksınız.
DT[i,j,by] komutu üç bölümden oluşur: i, j ve by. SQL terminolojisiyle düşünürseniz, i WHERE’a, j SELECT’e ve by GROUP BY’a karşılık gelir. Komutu şöyle ifade ederiz: “DT’yi alın, satırları ‘i’ ile altkümeye ayırın, ardından ‘by’ ile gruplayarak ‘j’yi hesaplayın.” Basit bir örnekte ve hflights veri setini kullanarak (tüm örnekleri siz de üretebilin diye) şu sonuç elde edilir:
library(hflights)
library(data.table)
DT <- as.data.table(hflights)
DT[Month==10,mean(na.omit(AirTime)), by=UniqueCarrier]
UniqueCarrier V1
AA 68.76471
AS 255.29032
B6 176.93548
CO 141.52861
...
Burada, yalnızca yılın 10. ayına ait satırları tutacak şekilde veri tablosunu altkümeye ayırdık, gerçekten uçan uçakların ortalama AirTime değerini hesapladık (na.omit() bu yüzden kullanılıyor; iptal edilen uçuşların AirTime için bir değeri yok) ve sonuçları taşıyıcılarına göre grupladık. Örneğin AA (American Airlines) için ortalama AirTime’ın AS’ye (Alaska Airlines) kıyasla çok daha kısa olduğunu görebiliriz. Ayrıca R’ın temel fonksiyonlarının j bölümünde kullanılabildiğini de fark ettiniz mi? Buna birazdan geleceğiz.
i Bölümü
‘i’ bölümü, tıpkı bir data frame’de olduğu gibi satır altkümeye alma için kullanılır.
DT[2:5]
#selects the second to the fifth row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 1 2 7 1401 1501 AA 428 N557AA 60 45
2011 1 3 1 1352 1502 AA 428 N541AA 70 48
2011 1 4 2 1403 1513 AA 428 N403AA 70 39
2011 1 5 3 1405 1507 AA 428 N492AA 62 44
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-9 1 IAH DFW 224 6 9 0 0
-8 -8 IAH DFW 224 5 17 0 0
3 3 IAH DFW 224 9 22 0 0
-3 5 IAH DFW 224 9 9 0 0
Ama sütun adlarını da kullanabilirsiniz; çünkü bunlar DT’nin kapsamı içinde değerlendirilir.
DT[UniqueCarrier=="AA"]
#Returns all those rows where the Carrier is American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
2011 1 1 6 1400 1500 AA 428 N576AA 60
2011 1 2 7 1401 1501 AA 428 N557AA 60
2011 1 3 1 1352 1502 AA 428 N541AA 70
2011 1 4 2 1403 1513 AA 428 N403AA 70
2011 1 5 3 1405 1507 AA 428 N492AA 62
---
2011 12 27 2 1021 1333 AA 2234 N3ETAA 132
2011 12 28 3 1015 1329 AA 2234 N3FJAA 134
2011 12 29 4 1023 1335 AA 2234 N3GSAA 132
2011 12 30 5 1024 1334 AA 2234 N3BAAA 130
2011 12 31 6 1024 1343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40 -10 0 IAH DFW 224 7 13 0 0
45 -9 1 IAH DFW 224 6 9 0 0
48 -8 -8 IAH DFW 224 5 17 0 0
39 3 3 IAH DFW 224 9 22 0 0
44 -3 5 IAH DFW 224 9 9 0 0
---
112 -12 1 IAH MIA 964 8 12 0 0
112 -16 -5 IAH MIA 964 9 13 0 0
110 -10 3 IAH MIA 964 12 10 0 0
110 -11 4 IAH MIA 964 9 11 0 0
119 -2 4 IAH MIA 964 8 12 0 0
Bir data table’da satır altkümeye almak için virgül kullanmak zorunda olmadığınıza dikkat edin. Bir data.frame’de DF[2:5] yapmak 2. ile 5. sütun arasındaki tüm sütunların satırlarını verirdi. Bunun yerine (bunu okuyan herkesin bildiği gibi) DF[2:5,] belirtmemiz gerekir. Ayrıca DT[,2:5] ifadesinin data table’lar için bir anlamı olmadığını, data.table paketinin SSS belgesinin ilk sorusunda açıklandığını da unutmayın.
İlginç ve kullanışlı: Satır altkümeye alırken, DT[…] komutunda satır sayısını ya da son satırı ifade eden .N sembolünü de kullanabilirsiniz. Bunu son satırı veya ondan bir ofseti seçmek için kullanabilirsiniz.
DT[.N-1]
#Returns the penultimate row of DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
2011 12 6 2 656 812 WN 621 N727SW 76 64
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13 -4 HOU TUL 453 3 9 0 0
j Bölümü
‘j’ bölümü, sütunları seçmek ve onlarla bir şeyler yapmak için kullanılır. Ve bir şeyler gerçekten her şey olabilir. Her tür fonksiyon kullanılabilir; bu da data.table paketinin güçlü bir yönüdür.
DT[, mean(na.omit(ArrDelay))]
[1] 7.094334
‘i’ bölümünün boş bırakıldığına ve parantez içindeki ilk şeyin bir virgül olduğuna dikkat edin. Bu ilk başta sezgisel gelmeyebilir. Ancak bu, satırlarda herhangi bir altkümeye alma yapmadığımız, yani tüm satırların seçildiği anlamına gelir. ‘j’ bölümünde, tüm uçuşların ortalama varış gecikmesi hesaplanır. Görünüşe göre hflights veri setindeki ortalama uçak 7 dakikadan fazla gecikmiş. Bir sonraki uçuşunuza yetişirken hazırlıklı olun!
‘j’ bölümünde birden fazla sütun seçip onlarla bir şeyler yaptığınızda, ‘.()’ gösterimini kullanmanız gerekir. Bu gösterim aslında ‘list()’ için bir takma addır. ‘.()’ kullanmak bir data table döndürür; yukarıda görüldüğü gibi kullanmamak ise yalnızca bir vektör döndürür.
DT[, .(mean(na.omit(DepDelay)), mean(na.omit(ArrDelay)))]
V1 V2
9.444951 7.094334
‘.()’ gösterimini gerektiren bir başka kullanışlı özellik, sütunları DT[…] komutunun içinde yeniden adlandırmanıza olanak tanır.
DT[, .(Avg_ArrDelay =
mean(na.omit(ArrDelay)))]
Avg_ArrDelay
7.094334
DT[, .(Avg_DepDelay = mean(na.omit(DepDelay)),
avg_ArrDelay = mean(na.omit(ArrDelay)))]
Avg_DepDelay Avg_ArrDelay
9.444951 7.094334
Elbette, yeni sütun adları zorunlu değildir.
Yukarıdaki ‘i’ ve ‘j’ ile ilgili olanları birleştirirsek şunu elde ederiz:
DT[UniqueCarrier=="AA", .(Avg_DepDelay =
mean(na.omit(DepDelay)),
Avg_ArrDelay = mean(na.omit(ArrDelay)),
plot(DepTime,DepDelay,ylim=c(-15,200)),
abline(h=0))]
Avg_DepDelay Avg_ArrDelay V3 V4
6.390144 0.8917558 NULL NULL
Burada DT’yi aldık, ‘i’ bölümünde taşıyıcının AA olduğu tüm satırları seçtik, kalkış ve varıştaki ortalama gecikmeyi hesapladık ve ‘j’ bölümünde kalkış saatine karşı kalkış gecikmesini çizdirdik.
Özetle, ‘j’ bölümü o bölümde belirtilen sütunlar üzerinde hesaplamalar yapmak için kullanılır. Bir data table’ın sütunları değişken olarak görüldüğünden ve ‘j’ parçaları ifade olarak değerlendirildiğinden, ‘j’ bölümünde neredeyse her şey yapılabilir. Bu da programlama sürenizi kayda değer biçimde kısaltır.
by Bölümü
Bu data.table R eğitiminin son bölümü ‘by’ kısmına odaklanır. ‘by’ bölümü, ‘j’ bölümünü belirli bir değişken (ya da o değişkenin bir dönüşümü) bazında gruplamak istediğimizde kullanılır. ‘j’ ifadesinin her bir ‘by’ grubu için tekrarlandığını göreceksiniz. Kullanımı basittir: ‘by’ argümanında gruplayacağınız sütunu belirtirsiniz.
DT[,mean(na.omit(DepDelay)),by=Origin]
Origin V1
IAH 8.436951
HOU 12.837873
Burada, kalkıştan önceki ortalama gecikmeyi hesapladık, ancak bunu uçağın kalktığı yere göre gruplayarak yaptık. Görünüşe göre HOU’dan kalkan uçuşların ortalama gecikmesi IAH’tan kalkanlara kıyasla daha fazla.
‘j’ bölümünde olduğu gibi, ‘by’ bölümünde de pek çok şey yapabilirsiniz. ‘by’ bölümünde fonksiyonlar kullanılabilir; böylece ‘j’ bölümünde yaptığımız işlemlerin sonuçları, DT[…] komutunun içinde belirttiğimiz bir şeye göre gruplanır. DT[…] içinde fonksiyon kullanmak, o tek satırı oldukça güçlü kılar. Benzer şekilde, ‘by’ bölümünde birden fazla sütun kullanırken ‘.()’ gösterimini kullanmak gerekir.
DT[,.(Avg_DepDelay_byWeekdays = mean(na.omit(DepDelay))), by=.(Origin,Weekdays = DayOfWeek<6)]
Origin Weekdays Avg_DepDelay_byWeekdays
IAH FALSE 8.286543
IAH TRUE 8.492484
HOU FALSE 10.965384
HOU TRUE 13.433994
Burada, tüm uçakların kalkıştan önceki ortalama gecikmesi (‘i’ bölümünde altkümeye alma yok, yani tüm satırlar seçili) önce hesaplandı, ardından önce uçağın kalktığı yere sonra da haftanın gününe göre gruplandı. Hafta içi, hafta sonlarında False olur. Görünüşe göre kalkıştan önceki ortalama gecikme HOU’dan kalkışlarda IAH’a kıyasla daha yüksek ve şaşırtıcı biçimde hafta sonlarında gecikmeler daha düşük.
Hepsini bir araya getirirsek, tipik bir DT[i,j,by] komutu şunu verir:
DT[UniqueCarrier=="DL", .(Avg_DepDelay =
mean(na.omit(DepDelay)),
Avg_ArrDelay = mean(na.omit(ArrDelay)),
Compensation = mean(na.omit(ArrDelay - DepDelay))), by = .(Origin, Weekdays = DayOfWeek&lt;6)]
Origin Weekdays Avg_DepDelay Avg_ArrDelay Compensation
IAH FALSE 8.979730 4.116751 -4.825719
HOU FALSE 7.120000 2.656566 -4.555556
IAH TRUE 9.270948 6.281941 -2.836609
HOU TRUE 11.631387 10.406593 -1.278388
Burada Delta Air Lines tarafından işletilen uçakların altkümesi (‘i’ içinde seçilen) kalkış yerine ve hafta içine göre (‘by’ içinde) gruplandı. Havada telafi edilen süre de (‘j’ içinde) hesaplandı. Görünüşe göre hafta sonlarında, uçak IAH’tan mı yoksa HOU’dan mı kalkmış olursa olsun, havadayken telafi edilen süre (yani daha hızlı uçarak) daha büyük.
Data table paketinde keşfedilecek çok daha fazla şey var; ancak bu yazı temel DT[i,j,by] komutunu gözden geçirdi. DataCamp kursu tüm data table paketini kapsamlı biçimde açıklar. İpuçları ve geri bildirim alarak alıştırmaları tarayıcınızda kendi temponuzda yapabilir, videoları ve slaytları dilediğiniz kadar tekrar edebilirsiniz. Bu etkileşimli öğrenme yolu, data table’lar konusunda derin bilgi ve pratik deneyim kazanmanızı sağlar. Ücretsiz deneyin. DataCamp’in data.table R Paketi Cheat Sheet’ine göz atın.
Umarız bu data.table R eğitimi sayesinde data.table’ın temel sözdizimini artık anlıyorsunuz ve kendi başınıza denemeye hazırsınız. data.table paketiyle ilgili sorularınız varsa buraya bakın. Matt ve Arun çok aktiftir. data.table paketiyle ilgili bir sonraki blog yazılarından biri daha teknik olacak ve data table’ların geniş olanaklarına yakından bakacak. Takipte kalın!


