Kursus
Hampir setiap proyek analisis data R melibatkan pengambilan baris, kolom, atau nilai tertentu dari sebuah dataset yang lebih besar. Subsetting adalah caranya di R, menggunakan notasi bracket [] untuk kontrol pengindeksan tingkat rendah, fungsi subset() untuk penyaringan berbasis kondisi yang mudah dibaca, atau verba dplyr seperti filter() dan select() untuk pipeline data modern.
Ringkasan
-
Gunakan notasi bracket
df[rows, cols]untuk subset baris dan kolom berbasis posisi -
Gunakan
$untuk mengekstrak satu kolom sebagai vektor:df$column_name -
Gunakan
subset(df, condition)untuk penyaringan berbasis kondisi yang mudah dibaca pada sesi interaktif -
Tambahkan
drop = FALSEsaat memilih satu kolom agar hasil tetap berupa data frame -
Untuk kode produksi dan pipeline data, utamakan notasi bracket atau
dplyr::filter()dibandingsubset()
Memilih Baris
Berikut adalah contoh subsetting pada data frame bernama debt.
debt[3:6, ]
name payment
3 Dan 150
4 Rob 50
5 Rob 75
6 Rob 100
Sintaks df[rows, columns] adalah dasar dari subsetting di R. Di sini, 3:6 memilih baris ke-3 hingga ke-6, dan bagian kosong setelah koma berarti "kembalikan semua kolom." Hasilnya adalah data frame yang lebih kecil dengan struktur kolom yang sama seperti aslinya.
Memilih baris dari kolom tertentu
Salah satu perilaku yang perlu diperhatikan adalah penyederhanaan yang terjadi saat Anda memilih satu kolom. Memilih tiga baris pertama hanya dari kolom payment menyederhanakan hasil menjadi sebuah vektor.
debt[1:3, 2]
100 200 150
Angka 2 di sini merujuk pada kolom kedua dari debt, yaitu payment. Karena kita memilih satu kolom, R menghapus struktur data frame dan mengembalikan vektor numerik biasa.
Pemformatan dataframe
Untuk mempertahankannya sebagai dataframe, cukup tambahkan drop = FALSE seperti di bawah ini:
debt[1:3, 2, drop = FALSE]
payment
1 100
2 200
3 150
Memilih kolom tertentu
Anda juga dapat memilih satu kolom dengan operator $ dengan menulis dataframe$column. Contoh berikut mengekstrak kolom payment dari debt. R mengembalikan hasil sebagai vektor, bukan data frame.
debt$payment
100 200 150 50 75 100
Menggunakan Fungsi subset()
Ketika ingin membuat subset yang lebih kompleks atau subset berdasarkan sebuah kondisi, langkah berikutnya adalah menggunakan fungsi subset(). Misalnya, bagaimana jika Anda ingin melihat utang dari seseorang bernama Dan. Anda bisa saja menggunakan bracket untuk memilih utangnya dan menjumlahkannya, tetapi itu bukan cara yang sangat andal, terutama jika ada potensi perubahan pada dataset.
# Ini berfungsi, tetapi tidak informatif
debt[1:3, ]
subset() pada variabel kategorikal
Cara yang lebih baik adalah menggunakan fungsi subset() untuk memilih baris di mana kolom name sama dengan Dan. Perhatikan bahwa harus ada tanda sama dengan ganda (==), yang dikenal sebagai operator relasional.
# Ini berfungsi, tetapi tidak informatif dan tidak andal
debt[1:3, ]
# Jauh lebih informatif!
subset(debt, name == "Dan")
name payment
1 Dan 100
2 Dan 200
3 Dan 150
Hasilnya hanya berisi tiga baris di mana name sama dengan "Dan". Perhatikan bahwa nomor baris asli (1, 2, 3) dipertahankan, yang membantu Anda menelusuri hasil kembali ke data frame sumber.
subset() pada variabel numerik
Kita juga dapat melakukan subset pada kolom numerik. Jika kita ingin melihat baris di mana pembayaran sama dengan $100, Anda akan melakukan hal berikut:
subset(debt, payment == 100)
name payment
1 Dan 100
6 Rob 100
Dua baris memenuhi kondisi: baris 1 (Dan) dan baris 6 (Rob) sama-sama memiliki pembayaran tepat $100. Ini menunjukkan bahwa subset() memindai setiap baris terlepas dari name, dan mengembalikan semua kecocokan.
Mengakses dan Melakukan Subset Dataframe
Bagaimana jika Anda hanya membutuhkan arus kas dari perusahaan A? Di sini fungsi subset() memfilter baris dari data frame lain, cash:
subset(cash, company == "A")
company cash_flow year
1 A 1000 1
2 A 4000 3
3 A 550 4
Ingat:
-
Argumen pertama yang Anda berikan ke
subset()adalah nama dataframe Anda,cash. -
Perhatikan bahwa Anda tidak boleh menuliskan
companydalam tanda kutip! -
==adalah operator kesetaraan. Operator ini menguji di mana dua hal sama dan mengembalikan vektor logis.
Contoh Interaktif Metode subset()
Pada contoh berikut, kita menggunakan subset() untuk memilih baris cash yang sesuai dengan perusahaan B, lalu memfilter arus kas yang jatuh tempo dalam 1 tahun.
# Baris tentang perusahaan B
subset(cash, company == "B")
# Baris dengan arus kas yang jatuh tempo dalam 1 tahun
subset(cash, year == 1)
Saat Anda menjalankan kode di atas, akan menghasilkan keluaran berikut:
company cash_flow year
4 B 1500 1
5 B 1100 2
6 B 750 4
7 B 6000 5
company cash_flow year
1 A 1000 1
4 B 1500 1
Coba sendiri di kursus Introduction to R for Finance kami.
Konten ini diambil dari kursus Introduction to R for Finance oleh Lore Dirick di DataCamp.
Subsetting dengan dplyr
Paket tidyverse dplyr menyediakan alternatif modern untuk melakukan subset pada data frame. Fungsinya filter() memilih baris dan select() memilih kolom, keduanya menggunakan sintaks berbasis pipe yang merangkai operasi secara berurutan.
library(dplyr)
# Filter baris di mana name adalah "Dan"
debt %>% filter(name == "Dan")
# Pilih hanya kolom payment (tetap sebagai data frame)
debt %>% select(payment)
# Gabungkan: filter baris dan pilih kolom dalam satu pipeline
debt %>%
filter(payment >= 100) %>%
select(name, payment)
Tidak seperti subset(), fungsi-fungsi dplyr bekerja andal di dalam fungsi lain dan menangani operasi berkelompok, join, dan ringkasan dalam satu pipeline. Jika Anda membangun alur kerja analisis data alih-alih menjalankan kueri satuan, dplyr adalah alat standar.
Perbandingan Metode Subsetting
Mari bandingkan berbagai metode subsetting di R dalam sebuah tabel:
| Metode | Sintaks | Terbaik untuk | Catatan |
|---|---|---|---|
Brackets [] |
df[rows, cols] |
Kontrol tingkat rendah, pemrograman | Bekerja pada semua objek R |
$ |
df$col |
Ekstraksi satu kolom secara cepat | Mengembalikan vektor, bukan data frame |
subset() |
subset(df, cond) |
Filter interaktif | Tidak direkomendasikan di dalam fungsi |
dplyr::filter() |
df %>% filter(cond) |
Pipeline data, kode yang mudah dibaca | Memerlukan paket dplyr |
Pemikiran Akhir
R menyediakan beberapa cara untuk melakukan subset data: notasi bracket [] untuk kontrol penuh, subset() untuk penyaringan interaktif yang mudah dibaca, dan dplyr::filter() untuk pipeline data. Bracket bekerja pada objek R apa pun, subset() mudah dipahami untuk eksplorasi satuan, dan dplyr terukur dengan baik saat Anda merangkai banyak operasi.
Untuk mendalami manipulasi data di R, saya merekomendasikan kursus Data Manipulation with dplyr atau Introduction to the Tidyverse di DataCamp.
FAQ Subset di R
Apa perbedaan antara subset() dan dplyr::filter() di R?
Kedua fungsi menyaring baris berdasarkan kondisi, tetapi perilakunya berbeda dalam konteks pemrograman. subset() menggunakan evaluasi non-standar, yang membuatnya nyaman untuk penggunaan interaktif namun tidak andal di dalam fungsi buatan pengguna. dplyr::filter() dirancang untuk bekerja dengan aman di dalam fungsi dan terintegrasi dengan operator pipe (%>%) untuk merangkai beberapa langkah manipulasi data sekaligus.
Bagaimana cara melakukan subset beberapa kolom sekaligus di R?
Anda dapat memberikan vektor nama kolom atau indeks di dalam bracket. Misalnya, df[, c("name", "payment")] memilih dua kolom berdasarkan nama, sedangkan df[, c(1, 3)] memilihnya berdasarkan posisi. Dengan dplyr, Anda dapat menggunakan select(df, name, payment) atau fungsi bantu seperti starts_with() dan contains() untuk mencocokkan kolom berdasarkan pola.
Mengapa memilih satu kolom di R mengembalikan vektor, bukan data frame?
R menyederhanakan hasil secara default ketika hanya satu kolom dipilih menggunakan notasi bracket. Perilaku ini dikendalikan oleh parameter drop, yang default-nya adalah TRUE. Untuk menjaga hasil tetap sebagai data frame, tambahkan drop = FALSE pada ekspresi bracket Anda, misalnya, df[, 2, drop = FALSE].
Bisakah saya melakukan subset baris berdasarkan beberapa kondisi di R?
Ya. Anda dapat menggabungkan kondisi menggunakan operator & (AND) dan | (OR). Misalnya, subset(df, name == "Dan" & payment > 100) mengembalikan baris di mana name adalah Dan dan payment melebihi 100. Dengan dplyr, Anda dapat memisahkan kondisi dengan koma di dalam filter(): df %>% filter(name == "Dan", payment > 100).
