Tingkatkan Data Anda Munging dengan R

Diterbitkan: 2022-03-11

Bahasa R sering dianggap sebagai bahasa untuk ahli statistik dan ilmuwan data. Cukup lama yang lalu, ini sebagian besar benar. Namun, selama bertahun-tahun fleksibilitas yang diberikan R melalui paket telah membuat R menjadi bahasa tujuan yang lebih umum. R open source pada tahun 1995, dan sejak saat itu repositori paket R terus berkembang. Namun, dibandingkan dengan bahasa seperti Python, R sangat didasarkan pada data.

Berbicara tentang data, data tabular patut mendapat perhatian khusus, karena ini adalah salah satu tipe data yang paling umum digunakan. Ini adalah tipe data yang sesuai dengan struktur tabel yang dikenal dalam database, di mana setiap kolom dapat memiliki tipe yang berbeda, dan kinerja pemrosesan tipe data tertentu merupakan faktor penting untuk banyak aplikasi.

R dapat digunakan untuk munging data yang sangat efisien dari data tabular

R dapat digunakan untuk munging data yang sangat efisien dari data tabular
Menciak

Pada artikel ini, kami akan menyajikan bagaimana mencapai transformasi data tabular dengan cara yang efisien. Banyak orang yang sudah menggunakan R untuk pembelajaran mesin tidak menyadari bahwa munging data dapat dilakukan lebih cepat di R, dan mereka tidak perlu menggunakan alat lain untuk itu.

Solusi Performa Tinggi di R

Base R memperkenalkan kelas data.frame pada tahun 1997, yang didasarkan pada S-PLUS sebelumnya. Tidak seperti database yang biasa digunakan yang menyimpan data baris demi baris, R data.frame menyimpan data dalam memori sebagai struktur berorientasi kolom, sehingga membuatnya lebih hemat cache untuk operasi kolom yang umum dalam analitik. Selain itu, meskipun R adalah bahasa pemrograman fungsional, R tidak memaksakannya pada pengembang. Kedua peluang tersebut telah ditangani dengan baik oleh paket data.table R, yang tersedia di repositori CRAN. Ini bekerja cukup cepat saat mengelompokkan operasi, dan sangat hemat memori dengan berhati-hati dalam mewujudkan subset data perantara, seperti hanya mewujudkan kolom yang diperlukan untuk tugas tertentu. Itu juga menghindari salinan yang tidak perlu melalui semantik referensinya saat menambahkan atau memperbarui kolom. Versi pertama dari paket telah diterbitkan pada bulan April 2006, secara signifikan meningkatkan kinerja data.frame pada waktu itu. Deskripsi paket awal adalah:

Paket ini sangat sedikit. Satu-satunya alasan keberadaannya adalah bahwa buku putih menetapkan bahwa data.frame harus memiliki nama baris. Paket ini mendefinisikan data.table kelas baru yang beroperasi seperti data.frame, tetapi menggunakan memori hingga 10 kali lebih sedikit, dan bisa hingga 10 kali lebih cepat untuk membuat (dan menyalin). Ini juga membutuhkan kesempatan untuk mengizinkan subset() dan with() seperti ekspresi di dalam []. Sebagian besar kode disalin dari fungsi dasar dengan kode yang memanipulasi baris.nama dihapus.

Sejak itu, implementasi data.frame dan data.table telah ditingkatkan, tetapi data.table tetap menjadi lebih cepat dari basis R. Faktanya, data.table tidak hanya lebih cepat dari basis R, tetapi tampaknya menjadi satu dari alat pertengkaran data sumber terbuka tercepat yang tersedia, bersaing dengan alat seperti Python Pandas, dan database penyimpanan kolom atau aplikasi data besar seperti Spark. Performanya pada infrastruktur bersama yang terdistribusi belum dijadikan patokan, tetapi kemampuan untuk memiliki hingga dua miliar baris dalam satu instans memberikan prospek yang menjanjikan. Performa luar biasa berjalan seiring dengan fungsionalitas. Selain itu, dengan upaya baru-baru ini untuk memparalelkan bagian yang memakan waktu untuk peningkatan kinerja tambahan, satu arah untuk mendorong batas kinerja tampaknya cukup jelas.

Contoh Transformasi Data

Belajar R menjadi sedikit lebih mudah karena fakta bahwa ia bekerja secara interaktif, sehingga kita dapat mengikuti contoh langkah demi langkah dan melihat hasil setiap langkah kapan saja. Sebelum kita mulai, mari kita instal paket data.table dari repositori CRAN.

 install.packages("data.table")

Petunjuk yang berguna : Kita dapat membuka manual fungsi apa pun hanya dengan mengetikkan namanya dengan tanda tanya di depan, yaitu ?install.packages .

Memuat Data ke R

Ada banyak sekali paket untuk mengekstrak data dari berbagai format dan database, yang sering kali menyertakan driver asli. Kami akan memuat data dari file CSV , format paling umum untuk data tabular mentah. File yang digunakan dalam contoh berikut dapat ditemukan di sini. Kami tidak perlu khawatir tentang kinerja membaca CSV karena fungsi fread sangat dioptimalkan untuk itu.

Untuk menggunakan fungsi apa pun dari sebuah paket, kita perlu memuatnya dengan panggilan library .

 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

Jika data kita tidak dimodelkan dengan baik untuk diproses lebih lanjut, karena mereka perlu dibentuk ulang dari format panjang-ke-lebar atau lebar-ke-panjang (juga dikenal sebagai pivot dan unpivot ), kita dapat melihat ?dcast dan ?melt , diketahui dari paket reshape2. Namun, data.table mengimplementasikan metode yang lebih cepat dan hemat memori untuk kelas data.table/data.frame.

Membuat kueri dengan Sintaks data.table

Jika Anda Familiar dengan data.frame

Kueri data.table sangat mirip dengan kueri data.frame . Saat memfilter dalam argumen i , kita dapat menggunakan nama kolom secara langsung tanpa perlu mengaksesnya dengan tanda $ , seperti df[df$col > 1, ] . Saat memberikan argumen j berikutnya, kami menyediakan ekspresi untuk dievaluasi dalam cakupan data.table kami. Untuk meneruskan argumen j non-ekspresi gunakan with=FALSE . Argumen ketiga, tidak ada dalam metode data.frame , mendefinisikan grup, membuat ekspresi dalam j dievaluasi oleh grup.

 # data.frame DF[DF$col1 > 1L, c("col2", "col3")] # data.table DT[col1 > 1L, .(col2, col3), ...] # by group using: `by = col4`

Jika Anda Familiar dengan Database

data.table dalam banyak aspek terkait dengan kueri SQL yang mungkin sudah dikenal banyak orang. DT di bawah ini mewakili objek data.table dan sesuai dengan klausa FROM SQL.

 DT[ i = where, j = select | update, by = group by] [ having, ... ] [ order by, ... ] [ ... ] ... [ ... ] 

Mengurai Data Tabluar

Menyortir Baris dan Mengurutkan Ulang Kolom

Pengurutan data adalah transformasi penting untuk deret waktu, dan juga impor untuk ekstrak dan presentasi data. Sortir dapat dicapai dengan memberikan vektor bilangan bulat dari urutan baris ke argumen i , dengan cara yang sama seperti data.frame . Argumen pertama dalam order(carrier, -dep_delay) akan memilih data dalam urutan menaik pada bidang carrier dan urutan menurun pada ukuran dep_delay . Argumen kedua j , seperti yang dijelaskan di bagian sebelumnya, mendefinisikan kolom (atau ekspresi) yang akan dikembalikan dan urutannya.

 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

Untuk mengurutkan ulang data dengan referensi, alih-alih meminta data dalam urutan tertentu, kami menggunakan fungsi set* .

 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

Paling sering, kita tidak memerlukan kumpulan data asli dan kumpulan data yang diurutkan/diurutkan. Secara default, bahasa R, mirip dengan bahasa pemrograman fungsional lainnya, akan mengembalikan data yang diurutkan sebagai objek baru, dan dengan demikian akan membutuhkan memori dua kali lebih banyak daripada pengurutan berdasarkan referensi.

Kueri Subset

Mari kita buat subset dataset untuk penerbangan asal “JFK” dan bulan dari 6 hingga 9. Pada argumen kedua, kita mengelompokkan hasil ke kolom yang terdaftar, menambahkan satu variabel terhitung sum_delay .

 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

Secara default, saat mensubset dataset pada kolom tunggal data.table akan secara otomatis membuat indeks untuk kolom tersebut. Ini menghasilkan jawaban waktu nyata pada panggilan pemfilteran lebih lanjut di kolom itu.

Perbarui Kumpulan Data

Menambahkan kolom baru dengan referensi dilakukan menggunakan operator := , ini menetapkan variabel ke dalam kumpulan data di tempat. Ini menghindari salinan set data dalam memori, jadi kita tidak perlu menetapkan hasil ke setiap variabel baru.

 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

Untuk menambahkan lebih banyak variabel sekaligus, kita dapat menggunakan sintaks DT[, := (sum_delay = arr_delay + dep_delay)] , mirip dengan .(sum_delay = arr_delay + dep_delay) saat melakukan query dari dataset.

Dimungkinkan untuk melakukan sub-assign dengan referensi, hanya memperbarui baris tertentu di tempat, hanya dengan menggabungkan dengan argumen i .

 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

Data Agregat

Untuk menggabungkan data, kami memberikan argumen ketiga by tanda kurung siku. Kemudian, di j kita perlu menyediakan panggilan fungsi agregat, sehingga data dapat benar-benar diagregasi. Simbol .N yang digunakan dalam argumen j sesuai dengan jumlah semua pengamatan di setiap kelompok. Seperti disebutkan sebelumnya, agregat dapat dikombinasikan dengan himpunan bagian pada baris dan kolom pemilihan.

 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

Seringkali, kita mungkin perlu membandingkan nilai baris dengan agregatnya di atas grup. Dalam SQL, kami menerapkan agregat di atas partisi dengan : 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

Jika kita tidak ingin mengkueri data dengan agregat tersebut, dan alih-alih memasukkannya ke dalam tabel aktual yang diperbarui dengan referensi, kita dapat melakukannya dengan operator := . Ini menghindari salinan dataset dalam memori, jadi kita tidak perlu menetapkan hasil ke variabel baru.

 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

Bergabunglah dengan Kumpulan Data

Penggabungan dan penggabungan basis R dari kumpulan data dianggap sebagai jenis operasi subset khusus. Kami menyediakan kumpulan data yang ingin kami gabungkan dalam argumen kurung siku pertama i . Untuk setiap baris dalam kumpulan data yang disediakan untuk i , kami mencocokkan baris dari kumpulan data tempat kami menggunakan [ . Jika kita ingin menyimpan hanya baris yang cocok ( gabung dalam ), maka kita memberikan argumen tambahan nomatch = 0L . Kami menggunakan argumen on menentukan kolom tempat kami ingin menggabungkan kedua kumpulan data.

 # 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

Ketahuilah bahwa karena konsistensi ke subpengaturan dasar R, gabungan luar secara default adalah RIGHT OUTER . Jika kita mencari LEFT OUTER , kita perlu menukar tabel, seperti pada contoh di atas. Perilaku yang tepat juga dapat dikontrol dengan mudah dalam metode merge data.table , menggunakan API yang sama dengan base R merge data.frame .

Jika kita hanya ingin mencari kolom ke dataset kita, kita dapat melakukannya secara efisien dengan := operator dalam argumen j saat bergabung. Dengan cara yang sama seperti yang kita tetapkan dengan referensi, seperti yang dijelaskan di bagian Perbarui kumpulan data , kita baru saja menambahkan kolom dengan referensi dari kumpulan data tempat kita bergabung. Ini menghindari salinan data dalam memori, jadi kita tidak perlu menetapkan hasil ke variabel baru.

 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

Untuk agregat saat bergabung , gunakan by = .EACHI . Ia melakukan penggabungan yang tidak akan mewujudkan hasil gabungan antara dan akan menerapkan agregat dengan cepat, membuatnya hemat memori.

Rolling join adalah fitur yang tidak biasa, dirancang untuk menangani data yang dipesan. Ini sangat cocok untuk memproses data temporal, dan deret waktu secara umum. Ini pada dasarnya menggulung korek api dalam kondisi bergabung ke nilai pencocokan berikutnya. Gunakan dengan memberikan argumen roll saat bergabung.

Tumpang tindih cepat bergabung bergabung dengan kumpulan data berdasarkan periode dan penanganannya yang tumpang tindih dengan menggunakan berbagai operator yang tumpang tindih: any , within , start , end .

Fitur non-equi join untuk menggabungkan dataset menggunakan kondisi non-equal sedang dikembangkan.

Data Profil

Saat menjelajahi kumpulan data kami, terkadang kami mungkin ingin mengumpulkan informasi teknis tentang subjek tersebut, untuk lebih memahami kualitas data.

Statistik deskriptif

 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

Kardinalitas

Kita dapat memeriksa keunikan data dengan menggunakan fungsi uniqueN dan menerapkannya pada setiap kolom. Objek .SD dalam kueri di bawah ini sesuai dengan subset S dari D ata.table:

 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

Rasio NA

Untuk menghitung rasio nilai yang tidak diketahui ( NA dalam R, dan NULL dalam SQL) untuk setiap kolom, kami menyediakan fungsi yang diinginkan untuk diterapkan pada setiap kolom.

 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

Mengekspor Data

Data tabular ekspor cepat ke format CSV juga disediakan oleh paket data.table .

 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

Pada saat penulisan ini, fungsi fwrite belum dipublikasikan ke repositori CRAN. Untuk menggunakannya kita perlu menginstal versi pengembangan data.table , jika tidak kita dapat menggunakan fungsi dasar R write.csv , tetapi jangan berharap itu cepat.

Sumber daya

Ada banyak sumber daya yang tersedia. Selain manual yang tersedia untuk setiap fungsi, ada juga paket vinyet, yang merupakan tutorial yang berfokus pada subjek tertentu. Itu dapat ditemukan di halaman Memulai. Selain itu, halaman Presentasi mencantumkan lebih dari 30 materi (slide, video, dll.) dari presentasi data.table di seluruh dunia. Selain itu, dukungan komunitas telah berkembang selama bertahun-tahun, baru-baru ini mencapai pertanyaan ke-4000 pada tag data.table Stack Overflow, masih memiliki rasio tinggi (91,9%) dari pertanyaan yang dijawab. Plot di bawah ini menyajikan jumlah pertanyaan yang diberi tag data.table di Stack Overflow dari waktu ke waktu.

JADI pertanyaan bulanan untuk data.table - Hanya pertanyaan yang diberi tag data.table, bukan pertanyaan dengan jawaban data.table (diterima)

JADI pertanyaan bulanan untuk data.table - Hanya pertanyaan yang diberi tag data.table, bukan pertanyaan dengan jawaban data.table (diterima)

Ringkasan

Artikel ini memberikan contoh yang dipilih untuk transformasi data tabel yang efisien di R menggunakan paket data.table . Angka aktual pada kinerja dapat diperiksa dengan mencari tolok ukur yang dapat direproduksi. Saya menerbitkan posting blog ringkasan tentang solusi data.table untuk 50 pertanyaan StackOverflow dengan peringkat teratas untuk bahasa R yang disebut Memecahkan masalah R umum secara efisien dengan data.table, di mana Anda dapat menemukan banyak angka dan kode yang dapat direproduksi. Paket data.table menggunakan implementasi asli dari pemesanan radix cepat untuk operasi pengelompokannya, dan pencarian biner untuk himpunan bagian/gabungan cepat. Urutan radix ini telah dimasukkan ke dalam basis R dari versi 3.3.0. Selain itu, algoritme baru-baru ini diimplementasikan ke dalam platform pembelajaran mesin H2O dan diparalelkan melalui kluster H2O, memungkinkan penggabungan besar yang efisien pada baris 10B x 10B.

Terkait: Manipulasi Pengumpulan Data Dalam Memori Utama dengan Supergroup.js