Excel dan Format Lain

Membaca berkas Excel dengan readxl serta data SPSS dan Stata dengan haven.

Daftar isi

Data tidak selalu tiba sebagai CSV. Berkas Excel dengan ekstensi .xlsx dan .xls dibaca dengan paket readxl, sedangkan data dari perangkat lunak statistik seperti SPSS dan Stata dibaca dengan paket haven. Kedua paket mengembalikan tibble, sehingga alur kerja setelah impor identik dengan data yang berasal dari CSV. Agar seluruh contoh dapat dijalankan ulang, berkas contohnya ditulis terlebih dahulu dari R dengan writexl dan haven, dan tidak ada satu pun berkas pihak ketiga yang dibutuhkan.

Paket readxl hanya membaca, sementara writexl menulis berkas .xlsx tanpa perlu Excel terpasang. Fungsi write_xlsx() menerima daftar bernama, dan setiap anggotanya menjadi satu lembar (sheet) dengan nama yang diambil dari nama elemen daftarnya. Berkas rekap-praktikum.xlsx berikut berisi dua lembar, yaitu Kelas A dan Kelas B.

r Membuat berkas Excel dua lembar
library(tidyverse)
library(readxl)
library(writexl)
kelas_a <- tibble(
  nim   = c(2024001, 2024002, 2024003),
  nama  = c("Ali", "Budi", "Citra"),
  nilai = c(82, 75, 88)
)
kelas_b <- tibble(
  nim   = c(2024004, 2024005),
  nama  = c("Dewi", "Eka"),
  nilai = c(79, 91)
)
write_xlsx(list(`Kelas A` = kelas_a, `Kelas B` = kelas_b), "rekap-praktikum.xlsx")
kelas_a
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
# A tibble: 3 × 3
      nim nama  nilai
    <dbl> <chr> <dbl>
1 2024001 Ali      82
2 2024002 Budi     75
3 2024003 Citra    88

Pembacaan paling sederhana cukup menyebut nama berkasnya. read_excel() membuka lembar pertama secara default dan menebak tipe tiap kolom dari isinya, sehingga hasilnya langsung berupa tibble yang siap diperiksa.

r Membaca lembar pertama berkas Excel
read_excel("rekap-praktikum.xlsx")
text Keluaran
# A tibble: 3 × 3
      nim nama  nilai
    <dbl> <chr> <dbl>
1 2024001 Ali      82
2 2024002 Budi     75
3 2024003 Citra    88

Argumen lain yang sering dipakai adalah na untuk mendaftarkan teks yang dianggap nilai hilang, trim_ws untuk membuang spasi di tepi sel, dan n_max untuk membatasi banyaknya baris yang dibaca. Sel kosong pada berkas Excel dianggap nilai hilang secara otomatis. Adapun read_xls() dan read_xlsx() adalah nama panggilan yang perilakunya sama dengan read_excel(), cukup dipilih sesuai ekstensi berkas yang dihadapi.

Memilih lembar dan rentang#

Berkas Excel sering berisi lebih dari satu lembar. Argumen sheet menerima nama lembar maupun urutannya, dan penggunaan nama lebih tahan terhadap perubahan urutan lembar di kemudian hari.

r Membaca lembar tertentu
read_excel("rekap-praktikum.xlsx", sheet = "Kelas B")
text Keluaran
# A tibble: 2 × 3
      nim nama  nilai
    <dbl> <chr> <dbl>
1 2024004 Dewi     79
2 2024005 Eka      91

Rentang sel tertentu dipilih dengan argumen range. Fungsi cell_cols() membatasi pembacaan pada kolom tertentu, sedangkan notasi seperti A1:C4 membatasi baris dan kolom sekaligus. Rentang ini berguna ketika berkas memuat judul di baris atas, catatan di kolom samping, atau data yang hanya sebagian perlu dibaca.

r Membaca rentang kolom tertentu
read_excel("rekap-praktikum.xlsx", sheet = "Kelas A", range = cell_cols("A:B"))
text Keluaran
# A tibble: 3 × 2
      nim nama 
    <dbl> <chr>
1 2024001 Ali  
2 2024002 Budi 
3 2024003 Citra

Perilaku menebak tipe pada readxl juga diatur oleh guess_max, yaitu banyaknya baris yang dipakai menebak, dengan guess_max = Inf untuk mempertimbangkan seluruh baris. Mekanismenya sejajar dengan readr, sehingga kebiasaan pemeriksaan yang dibentuk pada berkas CSV tetap berlaku pada berkas Excel.

Mengendalikan tipe kolom#

readxl menebak tipe tiap kolom dari sel yang tidak kosong. Kolom identitas yang tersimpan sebagai angka terbaca sebagai numeric, dan masalahnya baru terasa bila identitas itu semestinya mempertahankan bentuk teksnya. Argumen col_types menerima vektor sepanjang jumlah kolom dengan nilai seperti text, numeric, date, guess, dan skip.

r Membaca kolom identitas sebagai teks
read_excel(
  "rekap-praktikum.xlsx",
  sheet = "Kelas A",
  col_types = c("text", "text", "numeric")
)
text Keluaran
# A tibble: 3 × 3
  nim     nama  nilai
  <chr>   <chr> <dbl>
1 2024001 Ali      82
2 2024002 Budi     75
3 2024003 Citra    88

Dengan col_types = c(“text”, “text”, “numeric”), kolom nim dipertahankan sebagai teks. Aturan yang sama berlaku untuk kode pos, nomor telepon, dan identitas berawalan nol lainnya. Penetapan tipe pada saat membaca tidak dapat mengembalikan angka nol yang sudah hilang di sumbernya, sehingga pemeriksaan berkas aslinya tetap diperlukan. Vektor col_types harus sepanjang jumlah kolom yang dibaca, dan butir yang tidak ingin diatur dapat diberi nilai guess agar tebakannya tetap berjalan pada kolom tersebut.

Data SPSS dengan haven#

Paket haven menghubungkan R dengan format perangkat lunak statistik. Untuk SPSS, write_sav() menulis berkas .sav dan read_sav() membacanya kembali. Keduanya bekerja pada tibble biasa, sehingga tabel yang sama dapat diputar ke berbagai format tanpa mengubah struktur datanya.

r Menulis dan membaca berkas SPSS
library(haven)
survei <- tibble(
  responden  = c("R1", "R2", "R3"),
  skala      = c(4, 2, 5),
  pendapatan = c(3.2, 4.1, 2.8)
)
write_sav(survei, "survei.sav")
read_sav("survei.sav")
text Keluaran
# A tibble: 3 × 3
  responden skala pendapatan
  <chr>     <dbl>      <dbl>
1 R1            4        3.2
2 R2            2        4.1
3 R3            5        2.8

Berkas SPSS asli sering membawa label variabel dan label nilai, yaitu teks penjelas untuk variabel maupun kode angkanya. haven menampung label tersebut sebagai atribut berkelas labelled pada kolom terkait. Paket pendamping bernama labelled menyediakan fungsi untuk membacanya. Pada contoh ini berkas ditulis tanpa label, sehingga kolomnya kembali sebagai numerik dan character biasa. Nama panggilan read_spss() juga tersedia bagi yang lebih menyukai penamaan yang mengikuti nama perangkat lunaknya.

Data Stata dengan haven#

Format Stata ditangani pasangan write_dta() dan read_dta() dengan pola yang sama. Ekstensinya .dta, dan hasil pembacaannya juga tibble. Label variabel dari berkas Stata asli muncul sebagai atribut kolom dan tidak mengubah nilai datanya. Apabila suatu proyek berpindah-pindah antarperangkat lunak statistik, satu tabel R yang sama dapat ditulis ulang ke .sav dan .dta tanpa penyesuaian apa pun pada isinya.

r Menulis dan membaca berkas Stata
write_dta(survei, "survei.dta")
read_dta("survei.dta")
text Keluaran
# A tibble: 3 × 3
  responden skala pendapatan
  <chr>     <dbl>      <dbl>
1 R1            4        3.2
2 R2            2        4.1
3 R3            5        2.8

Dengan tiga keluarga format dalam satu topik, kebiasaan yang perlu dibentuk adalah menyeragamkan titik masuk datanya. Setiap berkas, apa pun formatnya, berakhir sebagai tibble dengan nama kolom dan tipe yang dapat diperiksa lewat glimpse(). Perbedaan format hanya berlaku pada tahap membaca, sedangkan tahap mengolah dan menganalisis berjalan tanpa memedulikan asal berkasnya.

Ringkasan#

  • writexl::write_xlsx() menulis daftar tibble sebagai berkas Excel berlembar, dan readxl::read_excel() membacanya per lembar dengan argumen sheet serta range.
  • Argumen col_types pada readxl mengendalikan tipe tiap kolom, terutama untuk kolom identitas yang harus tetap berupa teks.
  • haven menyediakan write_sav() dan read_sav() untuk SPSS serta write_dta() dan read_dta() untuk Stata, dan semuanya kembali sebagai tibble.

Referensi#