Topik ini membahas dua verba dplyr yang bekerja pada kolom, yaitu select() untuk memilih sebagian kolom dan rename() untuk mengganti nama kolom. Pembahasan mencakup pemilihan berdasarkan nama, rentang nama, pembuangan kolom dengan tanda minus, fungsi bantu pemilihan yang mencocokkan pola nama dan tipe, penggantian nama satu kolom maupun banyak kolom sekaligus, serta kesalahan yang lazim terjadi. Dataset contoh didefinisikan ulang di awal topik agar seluruh contoh dapat dijalankan ulang secara mandiri.
library(tidyverse)
nilai <- tibble::tibble(
nama = c("Ali", "Budi", "Citra", "Dewi", "Eka", "Fajar", "Gita", "Hana"),
kelas = c("7A", "7B", "7A", "7B", "7A", "7B", "7A", "7B"),
nilai = c(88, 74, 92, 65, 81, 79, 95, 70),
kehadiran = c(0.95, 0.88, 1.00, 0.75, 0.92, 0.85, 0.98, 0.80)
)── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.1 ✔ readr 2.2.0
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.3 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
✔ purrr 1.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errorsMemilih kolom dengan select()#
Verba select() mengembalikan salinan tabel yang hanya memuat kolom-kolom yang disebutkan. Nama kolom dituliskan tanpa tanda kutip, dipisahkan koma, dan urutan penulisannya menentukan urutan kolom pada hasilnya. Baris tidak tersentuh sama sekali, sehingga jumlah baris hasilnya sama dengan tabel asalnya.
nilai |> select(nama, nilai, kehadiran)# A tibble: 8 × 3
nama nilai kehadiran
<chr> <dbl> <dbl>
1 Ali 88 0.95
2 Budi 74 0.88
3 Citra 92 1
4 Dewi 65 0.75
5 Eka 81 0.92
6 Fajar 79 0.85
7 Gita 95 0.98
8 Hana 70 0.8 Kolom kelas tidak ikut pada hasil karena tidak disebutkan. Urutan kolom pada hasil mengikuti urutan argumen, bukan urutan pada tabel asalnya, sehingga kolom dapat disusun ulang semudah mengubah urutan nama di dalam pemanggilan. Seperti verba dplyr pada umumnya, select() tidak mengubah tabel asalnya, dan hasilnya hilang apabila tidak disimpan ke dalam variabel.
Rentang dan pembuangan kolom#
Kolom yang berdekatan dapat dipilih dengan rentang berbentuk awal:akhir, dan pemilihan campuran antara rentang dengan nama tunggal juga sah. Rentang mengikuti urutan kolom pada tabel, bukan urutan alfabetis namanya.
nilai |> select(nama:kelas)# A tibble: 8 × 2
nama kelas
<chr> <chr>
1 Ali 7A
2 Budi 7B
3 Citra 7A
4 Dewi 7B
5 Eka 7A
6 Fajar 7B
7 Gita 7A
8 Hana 7B Arah pemilihan dapat dibalik dengan tanda minus, yaitu membuang kolom yang disebutkan dan mempertahankan sisanya. Cara ini berguna ketika kolom yang ingin dibuang jauh lebih sedikit daripada kolom yang ingin dipertahankan.
nilai |> select(-kelas, -kehadiran)# A tibble: 8 × 2
nama nilai
<chr> <dbl>
1 Ali 88
2 Budi 74
3 Citra 92
4 Dewi 65
5 Eka 81
6 Fajar 79
7 Gita 95
8 Hana 70Fungsi bantu pemilihan kolom#
Menyebutkan nama kolom satu per satu menjadi tidak praktis pada tabel dengan banyak kolom yang namanya berpola. dplyr menyediakan fungsi bantu (helper) pemilihan yang dipanggil di dalam select(), yaitu starts_with() dan ends_with() yang mencocokkan awalan atau akhiran nama, contains() yang mencocokkan potongan nama di posisi mana pun, serta where() yang memilih kolom berdasarkan tipe atau sifat lainnya melalui fungsi pengujinya. Agar polanya terlihat, tabel tambahan berikut dipakai sebagai bahan kerja bagian ini.
rapor <- tibble::tibble(
id_siswa = 1:4,
nama_siswa = c("Ali", "Budi", "Citra", "Dewi"),
nilai_harian = c(82, 75, 88, 79),
nilai_akhir = c(86, 72, 91, 77),
kelas = c("7A", "7B", "7A", "7B")
)
rapor# A tibble: 4 × 5
id_siswa nama_siswa nilai_harian nilai_akhir kelas
<int> <chr> <dbl> <dbl> <chr>
1 1 Ali 82 86 7A
2 2 Budi 75 72 7B
3 3 Citra 88 91 7A
4 4 Dewi 79 77 7B Empat pemanggilan berikut memakai tabel rapor untuk menunjukkan perilaku setiap fungsi bantu.
rapor |> select(starts_with("nilai"))
rapor |> select(ends_with("siswa"))
rapor |> select(contains("akhir"))
rapor |> select(where(is.numeric))# A tibble: 4 × 2
nilai_harian nilai_akhir
<dbl> <dbl>
1 82 86
2 75 72
3 88 91
4 79 77
# A tibble: 4 × 2
id_siswa nama_siswa
<int> <chr>
1 1 Ali
2 2 Budi
3 3 Citra
4 4 Dewi
# A tibble: 4 × 1
nilai_akhir
<dbl>
1 86
2 72
3 91
4 77
# A tibble: 4 × 3
id_siswa nilai_harian nilai_akhir
<int> <dbl> <dbl>
1 1 82 86
2 2 75 72
3 3 88 91
4 4 79 77starts_with("nilai") menangkap dua kolom yang berawalan nilai, ends_with("siswa") menangkap dua kolom yang berakhiran siswa, contains("akhir") menangkap nilai_akhir tanpa memedulikan posisi potongan kata itu, dan where(is.numeric) menangkap seluruh kolom bertipe numerik. Fungsi bantu ini boleh digabung dalam satu pemanggilan select(), misalnya select(nama_siswa, starts_with("nilai")).
Fungsi where() bekerja dengan cara yang berbeda karena argumennya berupa fungsi pengujian, bukan pola nama. Fungsi pengujian itu diterapkan pada setiap kolom, dan kolom yang menghasilkan TRUE ikut terpilih, sebagaimana is.numeric yang menguji tipe numerik pada contoh di atas. Pengujian lain seperti is.character atau is.factor dipakai dengan pola yang sama, sehingga pemilihan berdasarkan tipe tidak perlu mengetahui nama kolomnya lebih dahulu. Pemilihan dengan fungsi bantu juga boleh digabung dengan nama tunggal maupun rentang dalam satu pemanggilan select().
Mengganti nama kolom dengan rename()#
Verba rename() mengganti nama kolom tanpa mengubah isinya maupun memengaruhi kolom lain. Bentuk argumennya sama dengan penugasan, yaitu nama baru di sisi kiri tanda = dan nama lama di sisi kanannya.
nilai |> rename(nilai_ujian = nilai)# A tibble: 8 × 4
nama kelas nilai_ujian kehadiran
<chr> <chr> <dbl> <dbl>
1 Ali 7A 88 0.95
2 Budi 7B 74 0.88
3 Citra 7A 92 1
4 Dewi 7B 65 0.75
5 Eka 7A 81 0.92
6 Fajar 7B 79 0.85
7 Gita 7A 95 0.98
8 Hana 7B 70 0.8 Kolom nilai kini bernama nilai_ujian, sedangkan tiga kolom lainnya tetap seperti semula. Beberapa kolom dapat diganti sekaligus dalam satu pemanggilan dengan memisahkan pasangan-pasangannya menggunakan koma, sebagaimana rename(a = x, b = y). Verba ini tidak menambah maupun mengurangi banyaknya kolom, sehingga cocok untuk menyeragamkan nama kolom sebelum dua tabel digabungkan. Penggantian nama untuk banyak kolom sekaligus dilakukan dengan verba rename_with().
nilai |> rename_with(toupper)# A tibble: 8 × 4
NAMA KELAS NILAI KEHADIRAN
<chr> <chr> <dbl> <dbl>
1 Ali 7A 88 0.95
2 Budi 7B 74 0.88
3 Citra 7A 92 1
4 Dewi 7B 65 0.75
5 Eka 7A 81 0.92
6 Fajar 7B 79 0.85
7 Gita 7A 95 0.98
8 Hana 7B 70 0.8 Seluruh nama kolom kini ditulis dengan huruf kapital karena fungsi toupper diterapkan pada setiap namanya. Pemilihan kolom dengan fungsi bantu juga berlaku di sini, sehingga rename_with(toupper, starts_with("nilai")) hanya mengubah nama kolom yang berawalan nilai pada tabel rapor.
Kesalahan umum#
Kesalahan yang paling sering adalah menyebutkan nama kolom yang tidak ada. Contoh berikut memilih kolom nilai_rata yang tidak dimuat oleh tabel nilai.
nilai |> select(nilai_rata)Error in select(nilai, nilai_rata) : Can't select columns that don't exist.
✖ Column `nilai_rata` doesn't exist.Pesan errornya berbunyi Can't select columns that don't exist dan menunjuk nama nilai_rata sebagai kolom yang tidak ada. Penyebabnya biasanya salah ketik atau nama kolom yang berbeda dari ingatan, dan daftar nama kolom yang benar dapat diperiksa dengan names(nilai).
Kesalahan yang serupa muncul pada rename() apabila nama lama yang dirujuknya tidak ada. Contoh berikut mencoba mengganti nama kolom predikat yang memang belum ada pada tabel nilai.
nilai |> rename(nilai_huruf = predikat)Error in rename(nilai, nilai_huruf = predikat) : Can't rename columns that don't exist.
✖ Column `predikat` doesn't exist.Pola pesannya sama dengan kesalahan pada select(), yaitu kolom yang dirujuk tidak ditemukan. Perbaikannya juga sama, yaitu memeriksa nama yang benar dengan names() terlebih dahulu, kemudian menyunting nama yang dirujuk pada argumen rename().
Ringkasan#
select()mengembalikan salinan tabel yang kolomnya disebutkan, dengan urutan mengikuti urutan argumen, sedangkan barisnya tidak tersentuh.- Rentang
awal:akhirmemilih kolom berdekatan, dan tanda-membuang kolom yang disebutkan sambil mempertahankan sisanya. - Fungsi bantu
starts_with(),ends_with(),contains(), danwhere()memilih kolom berdasarkan pola nama atau tipenya. rename(nama_baru = nama_lama)mengganti satu nama kolom, sedangkanrename_with()menerapkan satu fungsi pada nama kolom yang terpilih.- Nama kolom yang keliru menghasilkan error dengan pesan
doesn't exist, dan nama yang benar dapat diperiksa dengannames().
Referensi#
- dplyr: A Grammar of Data Manipulation — tidyverse
— dokumentasi resmi verba
select(),rename(), danrename_with()beserta fungsi bantu pemilihannya. - R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — bab transformasi data menjelaskan pemilihan kolom beserta fungsi bantu pemilihannya.