R ile Veri Mıknatıslarınızı Arttırın

Yayınlanan: 2022-03-11

R 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.

R, tablo verilerinin çok verimli bir şekilde karıştırılması için kullanılabilir

R, tablo verilerinin çok verimli bir şekilde karıştırılması için kullanılabilir
Cıvıldamak

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, ... ] [ ... ] ... [ ... ] 

Tablo Verilerini Çözme

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.

data.table için aylık SO soruları - data.table (kabul edilen) cevapları olan değil, sadece data.table etiketli sorular

data.table için aylık SO soruları - data.table (kabul edilen) yanıtları olan değil, yalnızca data.table etiketli sorular

Ö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ı.

İlgili: Supergroup.js ile Üstün Bellek İçi Veri Toplama Manipülasyonu