select dan rename

Memilih dan mengganti nama kolom pada data frame.

Daftar isi

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.

r
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)
)
text Keluaran
── 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 errors

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

r
nilai |> select(nama, nilai, kehadiran)
text Keluaran
# 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.

r
nilai |> select(nama:kelas)
text Keluaran
# 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.

r
nilai |> select(-kelas, -kehadiran)
text Keluaran
# 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     70

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

r
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
text Keluaran
# 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.

r
rapor |> select(starts_with("nilai"))
rapor |> select(ends_with("siswa"))
rapor |> select(contains("akhir"))
rapor |> select(where(is.numeric))
text Keluaran
# 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          77

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

r
nilai |> rename(nilai_ujian = nilai)
text Keluaran
# 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().

r
nilai |> rename_with(toupper)
text Keluaran
# 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.

r
nilai |> select(nilai_rata)
text Keluaran
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.

r
nilai |> rename(nilai_huruf = predikat)
text Keluaran
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:akhir memilih kolom berdekatan, dan tanda - membuang kolom yang disebutkan sambil mempertahankan sisanya.
  • Fungsi bantu starts_with(), ends_with(), contains(), dan where() memilih kolom berdasarkan pola nama atau tipenya.
  • rename(nama_baru = nama_lama) mengganti satu nama kolom, sedangkan rename_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 dengan names().

Referensi#