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.
Menulis dan membaca berkas Excel#
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.
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── 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 88Pembacaan 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.
read_excel("rekap-praktikum.xlsx")# A tibble: 3 × 3
nim nama nilai
<dbl> <chr> <dbl>
1 2024001 Ali 82
2 2024002 Budi 75
3 2024003 Citra 88Argumen 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.
read_excel("rekap-praktikum.xlsx", sheet = "Kelas B")# A tibble: 2 × 3
nim nama nilai
<dbl> <chr> <dbl>
1 2024004 Dewi 79
2 2024005 Eka 91Rentang 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.
read_excel("rekap-praktikum.xlsx", sheet = "Kelas A", range = cell_cols("A:B"))# A tibble: 3 × 2
nim nama
<dbl> <chr>
1 2024001 Ali
2 2024002 Budi
3 2024003 CitraPerilaku 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.
read_excel(
"rekap-praktikum.xlsx",
sheet = "Kelas A",
col_types = c("text", "text", "numeric")
)# A tibble: 3 × 3
nim nama nilai
<chr> <chr> <dbl>
1 2024001 Ali 82
2 2024002 Budi 75
3 2024003 Citra 88Dengan 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.
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")# A tibble: 3 × 3
responden skala pendapatan
<chr> <dbl> <dbl>
1 R1 4 3.2
2 R2 2 4.1
3 R3 5 2.8Berkas 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.
write_dta(survei, "survei.dta")
read_dta("survei.dta")# A tibble: 3 × 3
responden skala pendapatan
<chr> <dbl> <dbl>
1 R1 4 3.2
2 R2 2 4.1
3 R3 5 2.8Dengan 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#
- readxl: Read Excel Files — tidyverse — Dokumentasi resmi readxl, termasuk argumen sheet, range, dan col_types.
- haven: Import and Export ‘SPSS’, ‘Stata’ and ‘SAS’ Files — tidyverse — Dokumentasi resmi haven untuk format SPSS dan Stata.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — Bab data import mencakup pembacaan berkas Excel dan format perangkat lunak statistik.