R Select(), Filter(), Arrange(), Pipeline dengan Contoh
⚡ Ringkasan Cerdas
Select, Filter, dan Arrange di R adalah tiga fungsi dplyr yang mengurangi data frame menjadi kolom, baris, dan urutan yang Anda butuhkan. Panduan ini menggabungkan ketiganya dengan operator pipe pada dataset waktu perjalanan yang terdiri dari 205 baris.
Apa itu dplyr di R?
dplyr adalah paket manipulasi data dari tidyverse. Paket ini menggantikan notasi kurung siku pada basis R dengan sejumlah kecil kata kerja, masing-masing dinamai sesuai dengan tindakan yang dilakukannya dan masing-masing mengambil data frame sebagai argumen pertamanya. Bentuk yang konsisten itulah yang memungkinkan kata kerja tersebut dirangkai bersama.
| Kata kerja | Bertindak pada | Apa yang dilakukannya |
|---|---|---|
| Pilih() | Kolom | Mempertahankan atau menghapus variabel |
| Saring() | Baris | Mempertahankan baris yang sesuai dengan suatu kondisi. |
| mengatur() | Baris | Mengatur ulang baris berdasarkan satu atau lebih kolom. |
| mengubah() | Kolom | Membuat atau memodifikasi variabel |
| meringkaskan() | Seluruh meja | Menggabungkan banyak baris menjadi satu statistik. |
| kelompokkan berdasarkan() | Seluruh meja | Memisahkan data sehingga kata kerja selanjutnya berjalan per kelompok. |
Tutorial ini membahas tiga kata kerja pertama ditambah tanda pipa. tutorial fungsi agregat Membahas fungsi group_by() dan summarise() secara mendalam.
Dataset yang Digunakan dalam Tutorial Ini
Pustaka bernama dplyr berisi kata kerja yang berharga untuk menavigasi di dalam dataset. Melalui tutorial ini, Anda akan menggunakan dataset Waktu Perjalanan. Dataset ini mencatat perjalanan yang dilakukan pengemudi antara rumah dan tempat kerja. Terdapat empat belas variabel dalam dataset, termasuk:
- DayOfWeek: Identifikasi hari dalam seminggu pengemudi menggunakan mobilnya
- Jarak: Total jarak perjalanan
- MaxSpeed: Kecepatan maksimum perjalanan
- TotalTime: Durasi perjalanan dalam menit
Dataset ini berisi 205 pengamatan, dan perjalanan tersebut terjadi dari Monday sampai hari Jumat.
Pertama-tama, Anda perlu:
- memuat kumpulan data
- memeriksa struktur datanya.
Salah satu fungsi dplyr yang berguna adalah glimpse(). Fungsi ini memiliki peran yang sama dengan str() di R dasar, tetapi mencetak satu baris per variabel dengan tipe dan beberapa nilai pertama, yang jauh lebih mudah dipindai pada dataset yang lebar.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Keluaran:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
Variabel Komentar jelas perlu diteliti lebih lanjut: semua observasi pertama kosong.
sum(df$Comments =="")
Code Penjelasan
- sum(df$Comments == “”): Hitung observasi yang sama dengan string kosong di kolom Komentar pada df
Keluaran:
## [1] 181
Setelah data dimuat, mulailah dengan kata kerja yang memangkas kolom.
Pilih()
Kita akan mulai dengan kata kerja select(). Kita tidak selalu memerlukan semua variabel, dan praktik yang baik adalah memilih hanya variabel yang Anda anggap relevan.
Kami memiliki 181 observasi yang hilang, hampir 90 persen dari kumpulan data. Jika Anda memutuskan untuk mengecualikannya, Anda tidak akan dapat melanjutkan analisis.
Kemungkinan lainnya adalah menghilangkan variabel Comment dengan kata kerja select().
Kita dapat memilih variabel dengan cara berbeda dengan select(). Perhatikan bahwa argumen pertama adalah kumpulan data.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Anda dapat menggunakan cara ketiga untuk mengecualikan variabel Komentar.
step_1_df <- select(df, -Comments) dim(df)
Keluaran:
## [1] 205 14
dim(step_1_df)
Keluaran:
## [1] 205 13
Kumpulan data asli memiliki 14 fitur sedangkan step_1_df memiliki 13 fitur.
Fungsi Bantu select() di R
Memberi nama setiap kolom menjadi tidak praktis begitu sebuah dataset memiliki puluhan variabel. dplyr menyediakan fitur pembantu yang memilih kolom berdasarkan pola atau berdasarkan tipe.
| Pembantu | Memilih kolom yang | Example |
|---|---|---|
| dimulai dengan() | Mulailah dengan sebuah untaian | pilih(df, dimulai dengan("Rata-rata")) |
| berakhir dengan() | Akhiri dengan sebuah string | pilih(df, diakhiri dengan("Waktu")) |
| mengandung() | Mengandung string di mana saja | pilih(df, berisi("Kecepatan")) |
| pertandingan() | Cocokkan ekspresi reguler | pilih(df, cocok dengan(“^Max|^Avg”)) |
| Di mana() | Lulus uji tipe | pilih(df, di mana(is.numeric)) |
| semuanya() | Belum diberi nama | pilih(df, TotalTime, everything()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
Dua kata kerja lainnya berpasangan secara alami dengan select(). Gunakan rename(new_name = old_name) untuk mengganti label kolom tanpa perlu menghapusnya.ping yang lainnya, dan relocate() untuk memindahkan kolom tanpa mencantumkan semuanya.
Saring()
Fungsi filter() mempertahankan observasi yang memenuhi suatu kondisi. Fungsi filter() bekerja persis seperti select(), Anda memasukkan data frame terlebih dahulu, kemudian kondisi yang dipisahkan oleh koma:
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Satu kriteria
Pertama-tama, Anda dapat menghitung jumlah observasi dalam setiap level variabel faktor.
table(step_1_df$GoingTo)
Code Penjelasan
- table(): Menghitung jumlah observasi per level. Fungsi ini mengharapkan variabel faktor atau karakter.
- tabel(step_1_df$GoingTo): Hitung jumlah perjalanan menuju setiap tujuan
Keluaran:
## ## GSK Home ## 105 100
Fungsi table() menunjukkan 105 perjalanan menuju GSK dan 100 ke Beranda.
Kita dapat memfilter data untuk mengembalikan satu kumpulan data dengan 105 observasi dan kumpulan data lainnya dengan 100 observasi.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Keluaran:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Keluaran:
## [1] 105 14
Beberapa kriteria
Kita dapat memfilter dataset dengan lebih dari satu kriteria. Misalnya, Anda dapat...tracpada pengamatan di mana tujuan perjalanan adalah Rumah dan perjalanan terjadi pada hari Rabu.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Keluaran:
## [1] 23 14
23 observasi cocok dengan kriteria ini.
Kondisi filter() umum dan Operator di R
Fungsi filter() mempertahankan setiap baris yang kondisinya bernilai TRUE. Baris yang bernilai NA akan dihilangkan, dan perilaku inilah yang mengejutkan sebagian besar pemula.
| Operator | Arti | Example |
|---|---|---|
| == | Sama dengan | filter(df, GoingTo == “Home”) |
| != | Tidak sebanding dengan | filter(df, DayOfWeek != “Monday") |
| & | DAN, keduanya harus memegang | filter(df, Jarak > 50 & Kecepatan Maksimum > 130) |
| | | ATAU, salah satu dari mereka dapat memegang | filter(df, DayOfWeek == “Monday” | HariDalamSeminggu == “Jumat”) |
| %di dalam% | Mencocokkan nilai apa pun dalam sebuah vektor. | filter(df, DayOfWeek %in% c(“Monday", "Jumat")) |
| di antara() | Berada di dalam rentang numerik | filter(df, between(Jarak, 48, 52)) |
| adalah.na() | Apakah ada nilai yang hilang? | filter(df, is.na(EkonomiBahanBakar)) |
Tiga kebiasaan ini mencegah sebagian besar bug pada fungsi filter().
- Gunakan %in% sebagai pengganti OR berantai. filter(df, DayOfWeek %in% c(“Monday”, “Jumat”)) lebih pendek dan jauh lebih sulit salah ketik daripada dua perbandingan == yang dihubungkan oleh garis vertikal.
- Jangan pernah menguji nilai yang hilang dengan ==. Ekspresi x == NA mengembalikan NA, bukan TRUE, sehingga baris tersebut dihapus tanpa pemberitahuan. Gunakan is.na(x) sebagai gantinya.
- Tanda koma berarti DAN. filter(df, a, b) identik dengan filter(df, a & b), itulah sebabnya contoh sebelumnya dalam tutorial ini berfungsi dengan baik dalam kedua cara tersebut.
Pipa Operator di dplyr
Pembuatan dataset memerlukan banyak operasi, seperti:
- pengimporan
- penggabungan
- memilih
- penyaringan
- dan sebagainya
Pustaka dplyr dilengkapi dengan operator praktis, %>%, yang disebut pipaHal ini membuat manipulasi data lebih bersih, lebih cepat, dan lebih kecil kemungkinannya terjadi kesalahan.
Operator ini adalah kode yang melakukan langkah-langkah tanpa menyimpan langkah-langkah perantara ke hard drive. Jika Anda kembali ke contoh di atas, Anda dapat memilih variabel yang diinginkan dan memfilternya. Kami memiliki tiga langkah:
- Langkah 1: Impor data: Impor data gps
- Langkah 2: Pilih data: Pilih GoingTo dan DayOfWeek
- Langkah 3: Filter data: Kembali ke Rumah dan Rabu saja
Kita dapat menggunakan cara yang sulit untuk melakukannya:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Keluaran:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Itu bukan cara yang praktis untuk menggabungkan banyak operasi. Setiap hasil perantara tetap berada di lingkungan tersebut, dan nama-nama tersebut dengan cepat kehilangan maknanya.
Gunakan operator pipa %>% sebagai gantinya. Anda memberi nama data frame sekali di awal dan setiap langkah selanjutnya akan mengikuti nama tersebut.
Sintaks dasar pipa
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: the last instruction does not need a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints in the console.
Anda dapat membuat pipa pertama Anda dengan mengikuti langkah-langkah yang disebutkan di atas.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) %>% #Step 2 select(GoingTo, DayOfWeek) %>% #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Keluaran:
## [1] TRUE
Kedua objek tersebut identik, sehingga perintah pipe menghasilkan hasil yang persis sama dalam satu pernyataan yang mudah dibaca.
mengatur()
Dalam majalah tutorial sebelumnya, Anda mempelajari cara mengurutkan nilai dengan fungsi sort(). Perpustakaan dplyr memiliki fungsi penyortirannya. Ini bekerja seperti pesona dengan pipa. Kata kerja arrange() dapat menyusun ulang satu atau beberapa baris, baik menaik (default) atau menurun.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Kita bisa mengurutkan jarak berdasarkan tujuan.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Keluaran:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
dplyr Kata Kerja dalam R: Referensi Cepat
Tabel di bawah ini mencantumkan setiap kata kerja yang digunakan dalam tutorial ini, beserta sintaks dan nilai yang dikembalikan oleh setiap panggilan:
| Kata kerja | Tujuan | Code | Penjelasan |
|---|---|---|---|
| melihat sekilas | periksa struktur df |
glimpse(df)
|
Fungsinya sama dengan str(), lebih mudah dibaca. |
| Pilih() | Pilih/kecualikan variabel |
select(df, A, B ,C)
|
Pilih variabel A, B dan C |
select(df, A:C)
|
Pilih semua variabel dari A hingga C | ||
select(df, -C)
|
Kecualikan C | ||
| Saring() | Pertahankan baris yang sesuai dengan satu atau lebih kondisi. |
filter(df, condition1)
|
Satu syarat |
filter(df, condition1 & condition2)
|
Dua kondisi digabungkan dengan DAN | ||
| mengatur() | Urutkan kumpulan data dengan satu atau banyak variabel |
arrange(A)
|
Semacam variabel A menaik |
arrange(A, B)
|
Semacam variabel A dan B | ||
arrange(desc(A), B)
|
Urutan menurun dari variabel A dan urutan naik dari B | ||
| %>% | Buat alur di antara setiap langkah |
step 1 %>% step 2 %>% step 3 |

