R ile Veri Mıknatıslarınızı Arttırın
Yayınlanan: 2022-03-11R dili genellikle istatistikçiler ve veri bilimcileri için bir dil olarak algılanır. Oldukça uzun zaman önce, bu çoğunlukla doğruydu. Bununla birlikte, yıllar içinde R'nin paketler aracılığıyla sağladığı esneklik, R'yi daha genel amaçlı bir dile dönüştürmüştür. R, 1995'te açık kaynaklıydı ve o zamandan beri R paketlerinin depoları sürekli büyüyor. Yine de, Python gibi dillerle karşılaştırıldığında, R, güçlü bir şekilde verilere dayanmaktadır.
Verilerden bahsetmişken, tablo verileri en sık kullanılan veri türlerinden biri olduğu için özel ilgiyi hak ediyor. Bu, veritabanlarında bilinen, her sütunun farklı bir türde olabileceği bir tablo yapısına karşılık gelen bir veri türüdür ve bu belirli veri türünün işleme performansı, birçok uygulama için çok önemli bir faktördür.
Bu yazıda, verimli bir şekilde tablo veri dönüşümünün nasıl gerçekleştirileceğini sunacağız. R'yi zaten makine öğrenimi için kullanan birçok kişi, R'de veri parçalamanın daha hızlı yapılabileceğinin ve bunun için başka bir araç kullanmalarına gerek olmadığının farkında değil.
R'de Yüksek Performanslı Çözüm
Base R, kendinden önceki S-PLUS'a dayanan data.frame
sınıfını 1997 yılında tanıttı. Verileri satır satır depolayan yaygın olarak kullanılan veritabanlarının aksine, R data.frame
verileri bellekte sütun yönelimli bir yapı olarak saklar, böylece analitikte yaygın olan sütun işlemleri için önbellek açısından daha verimli olmasını sağlar. Ek olarak, R işlevsel bir programlama dili olmasına rağmen, bunu geliştirici üzerinde zorlamaz. Her iki fırsat da, CRAN deposunda bulunan data.table
R paketi tarafından iyi bir şekilde ele alınmıştır. İşlemleri gruplarken oldukça hızlı çalışır ve yalnızca belirli bir görev için gerekli olan sütunları somutlaştırmak gibi, ara veri alt kümelerini somutlaştırmaya dikkat ederek özellikle bellek açısından verimlidir. Ayrıca sütun eklerken veya güncellerken referans semantiği aracılığıyla gereksiz kopyalardan kaçınır. Paketin ilk sürümü Nisan 2006'da yayınlandı ve o sırada data.frame
performansını önemli ölçüde geliştirdi. İlk paket açıklaması şuydu:
Bu paket çok az şey yapar. Varlığının tek nedeni, beyaz kitabın data.frame'in satır adlarına sahip olması gerektiğini belirtmesidir. Bu paket, tıpkı bir data.frame gibi çalışan, ancak 10 kata kadar daha az bellek kullanan ve oluşturmak (ve kopyalamak) için 10 kata kadar daha hızlı olabilen yeni bir data.table sınıfı tanımlar. Ayrıca [] içinde subset() ve with() benzeri ifadelere izin verme fırsatını da alır. Kodun çoğu, satır adlarını değiştiren kod kaldırılarak temel işlevlerden kopyalanır.
O zamandan beri, hem data.frame
hem de data.table
uygulamaları geliştirildi, ancak data.table
, base R'den inanılmaz derecede daha hızlı olmaya devam ediyor. Aslında data.table
, base R'den sadece daha hızlı değil, aynı zamanda bir tane gibi görünüyor. Python Pandas gibi araçlarla ve sütunlu depolama veritabanlarıyla veya Spark gibi büyük veri uygulamalarıyla rekabet eden, mevcut en hızlı açık kaynaklı veri tartışma aracından biri. Dağıtılmış paylaşılan altyapı üzerindeki performansı henüz kıyaslanmadı, ancak tek bir örnekte iki milyara kadar satıra sahip olması umut verici beklentiler sunuyor. Olağanüstü performans, işlevlerle el ele gider. Ek olarak, artan performans kazanımları için zaman alıcı parçaları paralelleştirmeye yönelik son çabalarla, performans sınırını zorlamaya yönelik bir yön oldukça açık görünüyor.
Veri Dönüşüm Örnekleri
Etkileşimli çalıştığı için R'yi öğrenmek biraz daha kolaylaşıyor, bu nedenle örnekleri adım adım takip edebiliyor ve her adımın sonuçlarına istediğimiz zaman bakabiliyoruz. Başlamadan önce data.table
paketini CRAN deposundan kuralım.
install.packages("data.table")
Faydalı ipucu : Herhangi bir fonksiyonun kullanım kılavuzunu sadece adını baştaki soru işaretiyle yazarak açabiliriz yani ?install.packages
.
Verileri R'ye Yükleme
Çoğu zaman yerel sürücüleri içeren çok çeşitli formatlardan ve veritabanlarından veri çıkarmak için tonlarca paket vardır. Ham tablo verileri için en yaygın format olan CSV dosyasından veri yükleyeceğiz. Aşağıdaki örneklerde kullanılan dosya burada bulunabilir. CSV
okuma performansı hakkında endişelenmemize gerek yok çünkü fread
işlevi bu konuda oldukça optimize edilmiş.
Bir paketten herhangi bir işlevi kullanmak için onu library
çağrısı ile yüklememiz gerekir.
library(data.table) DT <- fread("flights14.csv") print(DT)
## year month day dep_delay arr_delay carrier origin dest air_time ## 1: 2014 1 1 14 13 AA JFK LAX 359 ## 2: 2014 1 1 -3 13 AA JFK LAX 363 ## 3: 2014 1 1 2 9 AA JFK LAX 351 ## 4: 2014 1 1 -8 -26 AA LGA PBI 157 ## 5: 2014 1 1 2 1 AA JFK LAX 350 ## --- ## 253312: 2014 10 31 1 -30 UA LGA IAH 201 ## 253313: 2014 10 31 -5 -14 UA EWR IAH 189 ## 253314: 2014 10 31 -8 16 MQ LGA RDU 83 ## 253315: 2014 10 31 -4 15 MQ LGA DTW 75 ## 253316: 2014 10 31 -5 1 MQ LGA SDF 110 ## distance hour ## 1: 2475 9 ## 2: 2475 11 ## 3: 2475 19 ## 4: 1035 7 ## 5: 2475 13 ## --- ## 253312: 1416 14 ## 253313: 1400 8 ## 253314: 431 11 ## 253315: 502 11 ## 253316: 659 8
Verilerimiz daha sonraki işlemler için iyi modellenmemişse, uzundan genişe veya genişten uzuna ( pivot ve unpivot olarak da bilinir) biçiminden yeniden şekillendirilmeleri gerektiğinden, ?dcast
ve ?melt
işlevlerine bakabiliriz, reshape2 paketinden bilinir. Ancak data.table
, data.table/data.frame sınıfı için daha hızlı ve bellek açısından verimli yöntemler uygular.
data.table
Sözdizimi ile sorgulama
data.frame
ile aşina iseniz
Sorgu data.table
, data.frame
sorgusuna çok benzer. i
argümanında filtreleme yaparken, df[df$col > 1, ]
gibi $
işaretiyle erişmeye gerek kalmadan sütun adlarını doğrudan kullanabiliriz. Sonraki j
argümanını sağlarken, data.table
kapsamında değerlendirilecek bir ifade sağlıyoruz. İfade olmayan bir j
bağımsız değişkeni iletmek için with=FALSE
kullanın. data.frame
yönteminde bulunmayan üçüncü argüman, grupları tanımlar ve j
ifadenin gruplar tarafından değerlendirilmesini sağlar.
# data.frame DF[DF$col1 > 1L, c("col2", "col3")] # data.table DT[col1 > 1L, .(col2, col3), ...] # by group using: `by = col4`
Veritabanlarına aşina iseniz
Sorgu data.table
birçok yönden daha fazla kişinin aşina olabileceği SQL sorgularına karşılık gelir. Aşağıdaki DT
, data.table
nesnesini temsil eder ve SQLs FROM
yan tümcesine karşılık gelir.
DT[ i = where, j = select | update, by = group by] [ having, ... ] [ order by, ... ] [ ... ] ... [ ... ]
Satırları Sıralama ve Sütunları Yeniden Sıralama
Verileri sıralamak, zaman serileri için çok önemli bir dönüşümdür ve aynı zamanda veri ayıklama ve sunum için de içe aktarılır. Sıralama, data.frame
ile aynı şekilde, i
argümanına satır sırasının tamsayı vektörü sağlanarak gerçekleştirilebilir. Sorgu order(carrier, -dep_delay)
ilk argüman, verileri carrier
alanında artan düzende ve dep_delay
ölçüsünde azalan düzende seçecektir. İkinci argüman j
, önceki bölümde açıklandığı gibi döndürülecek sütunları (veya ifadeleri) ve bunların sırasını tanımlar.
ans <- DT[order(carrier, -dep_delay), .(carrier, origin, dest, dep_delay)] head(ans)
## carrier origin dest dep_delay ## 1: AA EWR DFW 1498 ## 2: AA JFK BOS 1241 ## 3: AA EWR DFW 1071 ## 4: AA EWR DFW 1056 ## 5: AA EWR DFW 1022 ## 6: AA EWR DFW 989
Verileri referansa göre yeniden sıralamak için verileri belirli bir sırayla sorgulamak yerine set*
işlevlerini kullanırız.
setorder(DT, carrier, -dep_delay) leading.cols <- c("carrier","dep_delay") setcolorder(DT, c(leading.cols, setdiff(names(DT), leading.cols))) print(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## --- ## 253312: WN -12 2014 3 9 -21 LGA BNA 115 ## 253313: WN -13 2014 3 10 -18 EWR MDW 112 ## 253314: WN -13 2014 5 17 -30 LGA HOU 202 ## 253315: WN -13 2014 6 15 10 LGA MKE 101 ## 253316: WN -13 2014 8 19 -30 LGA CAK 63 ## distance hour ## 1: 1372 7 ## 2: 187 13 ## 3: 1372 10 ## 4: 1372 6 ## 5: 1372 7 ## --- ## 253312: 764 16 ## 253313: 711 20 ## 253314: 1428 17 ## 253315: 738 20 ## 253316: 397 16
Çoğu zaman, hem orijinal veri kümesine hem de sıralanmış/sıralanmış veri kümesine ihtiyacımız yoktur. Varsayılan olarak, R dili, diğer işlevsel programlama dillerine benzer şekilde, sıralanmış verileri yeni nesne olarak döndürür ve bu nedenle, başvuruya göre sıralamaya göre iki kat daha fazla bellek gerektirir.
Alt Küme Sorguları
"JFK" uçuş kalkış noktası ve 6 ile 9 arasındaki ay için bir alt küme veri kümesi oluşturalım. İkinci argümanda, sonuçları listelenen sütunlara alt kümeler halinde, bir hesaplanmış sum_delay
değişkeni ekleyerek oluşturalım.
ans <- DT[origin == "JFK" & month %in% 6:9, .(origin, month, arr_delay, dep_delay, sum_delay = arr_delay + dep_delay)] head(ans)
## origin month arr_delay dep_delay sum_delay ## 1: JFK 7 925 926 1851 ## 2: JFK 8 727 772 1499 ## 3: JFK 6 466 451 917 ## 4: JFK 7 414 450 864 ## 5: JFK 6 411 442 853 ## 6: JFK 6 333 343 676
Varsayılan olarak, veri kümesini tek sütunda data.table
, o sütun için otomatik olarak bir dizin oluşturur. Bu, o sütundaki diğer filtreleme çağrılarında gerçek zamanlı yanıtlarla sonuçlanır.
Veri Kümesini Güncelle
Referansa göre yeni bir sütun ekleme :=
operatörü kullanılarak gerçekleştirilir, yerinde veri kümesine bir değişken atar. Bu, veri kümesinin bellek içi kopyalanmasını önler, bu nedenle her yeni değişkene sonuç atamamız gerekmez.
DT[, sum_delay := arr_delay + dep_delay] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: 187 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
Bir kerede daha fazla değişken eklemek için, veri kümesinden sorgulama yaparken .(sum_delay = arr_delay + dep_delay)
gibi DT[,
:= (sum_delay = arr_delay + dep_delay)]
sözdizimini kullanabiliriz.
Sadece i
argümanı ile birleştirerek, sadece belirli satırları yerinde güncelleyerek referansa göre alt atama yapmak mümkündür.
DT[origin=="JFK", distance := NA] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay ## 1: 1372 7 2992 ## 2: NA 13 2464 ## 3: 1372 10 2135 ## 4: 1372 6 2171 ## 5: 1372 7 2095 ## 6: 1372 11 1980
Toplam veri
Verileri toplamak için köşeli by
içinde üçüncü argümanı sağlıyoruz. Ardından, j
verilerin gerçekten toplanabilmesi için toplu işlev çağrıları sağlamamız gerekir. j
argümanında kullanılan .N
sembolü, her gruptaki tüm gözlemlerin sayısına karşılık gelir. Daha önce bahsedildiği gibi, toplamalar, satırlardaki ve sütunların seçilmesindeki alt kümelerle birleştirilebilir.
ans <- DT[, .(m_arr_delay = mean(arr_delay), m_dep_delay = mean(dep_delay), count = .N), .(carrier, month)] head(ans)
## carrier month m_arr_delay m_dep_delay count ## 1: AA 10 5.541959 7.591497 2705 ## 2: AA 4 1.903324 3.987008 2617 ## 3: AA 6 8.690067 11.476475 2678 ## 4: AA 9 -1.235160 3.307078 2628 ## 5: AA 8 4.027474 8.914054 2839 ## 6: AA 7 9.159886 11.665953 2802
Çoğu zaman, bir satırın değerini, bir grup üzerindeki toplamıyla karşılaştırmamız gerekebilir. SQL'de, toplamaları şu şekilde bölümlere uygularız: AVG(arr_delay) OVER (PARTITION BY carrier, month)
.

ans <- DT[, .(arr_delay, carrierm_mean_arr = mean(arr_delay), dep_delay, carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(ans)
## carrier month arr_delay carrierm_mean_arr dep_delay carrierm_mean_dep ## 1: AA 10 1494 5.541959 1498 7.591497 ## 2: AA 10 840 5.541959 848 7.591497 ## 3: AA 10 317 5.541959 338 7.591497 ## 4: AA 10 292 5.541959 331 7.591497 ## 5: AA 10 322 5.541959 304 7.591497 ## 6: AA 10 306 5.541959 299 7.591497
Verileri bu kümelerle sorgulamak istemiyorsak ve bunun yerine onları referans olarak gerçek tablo güncellemesine koyarsak, bunu :=
operatörü ile başarabiliriz. Bu, veri kümesinin bellek içi kopyasını önler, bu nedenle sonuçları yeni değişkene atamamız gerekmez.
DT[, `:=`(carrierm_mean_arr = mean(arr_delay), carrierm_mean_dep = mean(dep_delay)), .(carrier, month)] head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep ## 1: 1372 7 2992 5.541959 7.591497 ## 2: NA 13 2464 1.903324 3.987008 ## 3: 1372 10 2135 8.690067 11.476475 ## 4: 1372 6 2171 -1.235160 3.307078 ## 5: 1372 7 2095 8.690067 11.476475 ## 6: 1372 11 1980 8.690067 11.476475
Veri Kümelerine Katılın
Base R, veri kümelerinin birleştirilmesi ve birleştirilmesi, özel bir alt küme işlemi türü olarak kabul edilir. İlk köşeli parantez i
katılmak istediğimiz bir veri kümesi sağlıyoruz. i
sağlanan veri kümesindeki her satır için, içinde kullandığımız veri kümesindeki satırları eşleştiririz [
. Yalnızca eşleşen satırları tutmak istiyorsak ( iç birleşim ), o zaman fazladan bir nomatch = 0L
argümanı iletiyoruz. Her iki veri kümesine de katılmak istediğimiz sütunları belirtmek için on
argümanını kullanırız.
# create reference subset carrierdest <- DT[, .(count=.N), .(carrier, dest) # count by carrier and dest ][1:10 # just 10 first groups ] # chaining `[...][...]` as subqueries print(carrierdest)
## carrier dest count ## 1: AA DFW 5877 ## 2: AA BOS 1173 ## 3: AA ORD 4798 ## 4: AA SEA 298 ## 5: AA EGE 85 ## 6: AA LAX 3449 ## 7: AA MIA 6058 ## 8: AA SFO 1312 ## 9: AA AUS 297 ## 10: AA DCA 172
# outer join ans <- carrierdest[DT, on = c("carrier","dest")] print(ans)
## carrier dest count dep_delay year month day arr_delay origin ## 1: AA DFW 5877 1498 2014 10 4 1494 EWR ## 2: AA BOS 1173 1241 2014 4 15 1223 JFK ## 3: AA DFW 5877 1071 2014 6 13 1064 EWR ## 4: AA DFW 5877 1056 2014 9 12 1115 EWR ## 5: AA DFW 5877 1022 2014 6 16 1073 EWR ## --- ## 253312: WN BNA NA -12 2014 3 9 -21 LGA ## 253313: WN MDW NA -13 2014 3 10 -18 EWR ## 253314: WN HOU NA -13 2014 5 17 -30 LGA ## 253315: WN MKE NA -13 2014 6 15 10 LGA ## 253316: WN CAK NA -13 2014 8 19 -30 LGA ## air_time distance hour sum_delay carrierm_mean_arr ## 1: 200 1372 7 2992 5.541959 ## 2: 39 NA 13 2464 1.903324 ## 3: 175 1372 10 2135 8.690067 ## 4: 198 1372 6 2171 -1.235160 ## 5: 178 1372 7 2095 8.690067 ## --- ## 253312: 115 764 16 -33 6.921642 ## 253313: 112 711 20 -31 6.921642 ## 253314: 202 1428 17 -43 22.875845 ## 253315: 101 738 20 -3 14.888889 ## 253316: 63 397 16 -43 7.219670 ## carrierm_mean_dep ## 1: 7.591497 ## 2: 3.987008 ## 3: 11.476475 ## 4: 3.307078 ## 5: 11.476475 ## --- ## 253312: 11.295709 ## 253313: 11.295709 ## 253314: 30.546453 ## 253315: 24.217560 ## 253316: 17.038047
# inner join ans <- DT[carrierdest, # for each row in carrierdest nomatch = 0L, # return only matching rows from both tables on = c("carrier","dest")] # joining on columns carrier and dest print(ans)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1071 2014 6 13 1064 EWR DFW 175 ## 3: AA 1056 2014 9 12 1115 EWR DFW 198 ## 4: AA 1022 2014 6 16 1073 EWR DFW 178 ## 5: AA 989 2014 6 11 991 EWR DFW 194 ## --- ## 23515: AA -8 2014 10 11 -13 JFK DCA 53 ## 23516: AA -9 2014 5 21 -12 JFK DCA 52 ## 23517: AA -9 2014 6 5 -6 JFK DCA 53 ## 23518: AA -9 2014 10 2 -21 JFK DCA 51 ## 23519: AA -11 2014 5 27 10 JFK DCA 55 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: 1372 10 2135 8.690067 11.476475 5877 ## 3: 1372 6 2171 -1.235160 3.307078 5877 ## 4: 1372 7 2095 8.690067 11.476475 5877 ## 5: 1372 11 1980 8.690067 11.476475 5877 ## --- ## 23515: NA 15 -21 5.541959 7.591497 172 ## 23516: NA 15 -21 4.150172 8.733665 172 ## 23517: NA 15 -15 8.690067 11.476475 172 ## 23518: NA 15 -30 5.541959 7.591497 172 ## 23519: NA 15 -1 4.150172 8.733665 172
Temel R alt kümesiyle tutarlılık nedeniyle, dış birleştirmenin varsayılan olarak RIGHT OUTER
olduğunu unutmayın. LEFT OUTER
arıyorsak yukarıdaki örnekte olduğu gibi tabloları değiştirmemiz gerekiyor. Kesin davranış ayrıca, base R merge
data.frame
ile aynı API kullanılarak merge
data.table
yönteminde kolayca kontrol edilebilir.
Eğer veri setimizin sütun(lar)ını basitçe aramak istiyorsak, katılırken j
argümanında :=
operatörü ile verimli bir şekilde yapabiliriz. Referansa göre alt atadığımız gibi, Veri kümesini güncelle bölümünde açıklandığı gibi, şimdi katıldığımız veri kümesinden referansa göre bir sütun ekliyoruz. Bu, verilerin bellek içi kopyalanmasını önler, bu nedenle sonuçları yeni değişkenlere atamamız gerekmez.
DT[carrierdest, # data.table to join with lkp.count := count, # lookup `count` column from `carrierdest` on = c("carrier","dest")] # join by columns head(DT)
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: AA 1498 2014 10 4 1494 EWR DFW 200 ## 2: AA 1241 2014 4 15 1223 JFK BOS 39 ## 3: AA 1071 2014 6 13 1064 EWR DFW 175 ## 4: AA 1056 2014 9 12 1115 EWR DFW 198 ## 5: AA 1022 2014 6 16 1073 EWR DFW 178 ## 6: AA 989 2014 6 11 991 EWR DFW 194 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 1372 7 2992 5.541959 7.591497 5877 ## 2: NA 13 2464 1.903324 3.987008 1173 ## 3: 1372 10 2135 8.690067 11.476475 5877 ## 4: 1372 6 2171 -1.235160 3.307078 5877 ## 5: 1372 7 2095 8.690067 11.476475 5877 ## 6: 1372 11 1980 8.690067 11.476475 5877
Birleştirme sırasında toplama için , by = .EACHI
kullanın. Ara birleştirme sonuçlarını gerçekleştirmeyecek ve anında toplama uygulayarak, belleği verimli hale getirecek birleştirme gerçekleştirir.
Yuvarlamalı birleştirme , sıralı verilerle uğraşmak için tasarlanmış, yaygın olmayan bir özelliktir. Zamansal verileri ve genel olarak zaman serilerini işlemek için mükemmel uyum sağlar. Temel olarak, birleştirme koşulundaki eşleşmeleri bir sonraki eşleşen değere döndürür. Katılırken roll
argümanını sağlayarak kullanın.
Hızlı örtüşen birleşim , çeşitli örtüşen operatörleri kullanarak dönemlere ve bunların örtüşen işlemesine dayalı olarak veri kümelerini birleştirir: any
, within
, start
, end
.
Eşit olmayan koşulu kullanarak veri kümelerini birleştirmek için denk olmayan bir birleştirme özelliği şu anda geliştirilmektedir.
Profil Oluşturma Verileri
Veri setimizi incelerken, verilerin kalitesini daha iyi anlamak için bazen konuyla ilgili teknik bilgi toplamak isteyebiliriz.
Tanımlayıcı istatistikler
summary(DT)
## carrier dep_delay year month ## Length:253316 Min. :-112.00 Min. :2014 Min. : 1.000 ## Class :character 1st Qu.: -5.00 1st Qu.:2014 1st Qu.: 3.000 ## Mode :character Median : -1.00 Median :2014 Median : 6.000 ## Mean : 12.47 Mean :2014 Mean : 5.639 ## 3rd Qu.: 11.00 3rd Qu.:2014 3rd Qu.: 8.000 ## Max. :1498.00 Max. :2014 Max. :10.000 ## ## day arr_delay origin dest ## Min. : 1.00 Min. :-112.000 Length:253316 Length:253316 ## 1st Qu.: 8.00 1st Qu.: -15.000 Class :character Class :character ## Median :16.00 Median : -4.000 Mode :character Mode :character ## Mean :15.89 Mean : 8.147 ## 3rd Qu.:23.00 3rd Qu.: 15.000 ## Max. :31.00 Max. :1494.000 ## ## air_time distance hour sum_delay ## Min. : 20.0 Min. : 80.0 Min. : 0.00 Min. :-224.00 ## 1st Qu.: 86.0 1st Qu.: 529.0 1st Qu.: 9.00 1st Qu.: -19.00 ## Median :134.0 Median : 762.0 Median :13.00 Median : -5.00 ## Mean :156.7 Mean : 950.4 Mean :13.06 Mean : 20.61 ## 3rd Qu.:199.0 3rd Qu.:1096.0 3rd Qu.:17.00 3rd Qu.: 23.00 ## Max. :706.0 Max. :4963.0 Max. :24.00 Max. :2992.00 ## NA's :81483 ## carrierm_mean_arr carrierm_mean_dep lkp.count ## Min. :-22.403 Min. :-4.500 Min. : 85 ## 1st Qu.: 2.676 1st Qu.: 7.815 1st Qu.:3449 ## Median : 6.404 Median :11.354 Median :5877 ## Mean : 8.147 Mean :12.465 Mean :4654 ## 3rd Qu.: 11.554 3rd Qu.:17.564 3rd Qu.:6058 ## Max. : 86.182 Max. :52.864 Max. :6058 ## NA's :229797
kardinalite
uniqueN
işlevini kullanarak verilerin benzersizliğini kontrol edebilir ve her sütuna uygulayabiliriz. Aşağıdaki sorgudaki Object .SD
, D ata.table'ın alt kümesine karşılık gelir:
DT[, lapply(.SD, uniqueN)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 14 570 1 10 31 616 3 109 509 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 152 25 1021 134 134 11
NA Oranı
Her sütun için bilinmeyen değerlerin oranını (R'de NA
ve SQL'de NULL
) hesaplamak için, her sütuna uygulanması istenen işlevi sağlıyoruz.
DT[, lapply(.SD, function(x) sum(is.na(x))/.N)]
## carrier dep_delay year month day arr_delay origin dest air_time ## 1: 0 0 0 0 0 0 0 0 0 ## distance hour sum_delay carrierm_mean_arr carrierm_mean_dep lkp.count ## 1: 0.3216654 0 0 0 0 0.9071555
Verileri Dışa Aktarma
CSV
formatına hızlı dışa aktarma tablo verileri de data.table
paketi tarafından sağlanır.
tmp.csv <- tempfile(fileext=".csv") fwrite(DT, tmp.csv) # preview exported data cat(system(paste("head -3",tmp.csv), intern=TRUE), sep="\n")
## carrier,dep_delay,year,month,day,arr_delay,origin,dest,air_time,distance,hour,sum_delay,carrierm_mean_arr,carrierm_mean_dep,lkp.count ## AA,1498,2014,10,4,1494,EWR,DFW,200,1372,7,2992,5.54195933456561,7.59149722735674,5877 ## AA,1241,2014,4,15,1223,JFK,BOS,39,,13,2464,1.90332441727168,3.98700802445548,1173
Bunu yazarken, fwrite
işlevi henüz CRAN deposunda yayınlanmadı. Bunu kullanmak için data.table
geliştirme sürümünü yüklememiz gerekiyor, aksi takdirde base R write.csv
işlevini kullanabiliriz, ancak bunun hızlı olmasını beklemeyin.
Kaynaklar
Çok sayıda kaynak mevcuttur. Her işlev için mevcut kılavuzların yanı sıra, belirli bir konuya odaklanan öğreticiler olan paket vinyetleri de vardır. Bunlar Başlarken sayfasında bulunabilir. Ek olarak, Sunumlar sayfası, dünya çapındaki data.table
sunumlarından 30'dan fazla materyali (slaytlar, video vb.) listeler. Ayrıca, topluluk desteği yıllar içinde büyüdü, yakın zamanda Stack Overflow data.table
etiketindeki 4000. soruya ulaştı ve hala yüksek oranda (%91,9) yanıtlanan soru oranına sahip. Aşağıdaki grafik, zaman içinde Yığın Taşması ile ilgili data.table
etiketli soruların sayısını göstermektedir.
Özet
Bu makale, data.table
paketini kullanarak R'de verimli tablo veri dönüşümü için seçilmiş örnekler sağlar. Performansla ilgili gerçek rakamlar, tekrarlanabilir kriterler aranarak incelenebilir. Çok sayıda rakam ve tekrarlanabilir kod bulabileceğiniz data.table ile ortak R problemlerini verimli bir şekilde çözün adlı R dili için en çok oy alan 50 StackOverflow sorusu için data.table
çözümleri hakkında özet bir blog yazısı yayınladım. data.table
paketi, gruplama işlemleri için hızlı sayı tabanı sıralamasının yerel uygulamasını ve hızlı alt kümeler/birleştirmeler için ikili aramayı kullanır. Bu sayı tabanı sıralaması, sürüm 3.3.0'dan itibaren temel R'ye dahil edilmiştir. Ek olarak, algoritma yakın zamanda H2O makine öğrenimi platformuna uygulandı ve H2O kümesi üzerinden paralel hale getirilerek 10B x 10B satırlarında verimli büyük birleştirmeler sağlandı.