Menu

Membaca File Excel di R (readxl)

R tidak bisa membuka file .xlsx sendiri, dan package readxl mengisi kekurangan itu. Cara membaca sheet, rentang, dan header, menulis kembali ke Excel, dan menghindari jebakan klasik impor Excel.

R Butuh Package untuk Membaca File Excel

R dasar bisa langsung membaca format teks biasa, tetapi .xlsx bukan teks: ia kumpulan XML yang dikompresi, dan .xls sebelumnya adalah format biner. Tidak ada read.xlsx() bawaan yang menunggumu. Untuk membuka file Excel, kamu menginstal sebuah package, dan pilihan standarnya adalah readxl: ia membaca .xlsx maupun .xls, tidak punya dependensi eksternal (tidak butuh Java, tidak butuh Excel terinstal), dan mengerjakan satu tugas dengan baik.

install.packages("readxl")   # once per machine
library(readxl)              # once per session

Potongan kode di halaman ini butuh readxl terinstal secara lokal, jadi ditampilkan sebagai kode statis, bukan blok yang bisa dijalankan. Jalankan di sesi R milikmu sendiri. Kalau package masih baru bagimu, versi singkatnya: install.packages() mengunduhnya sekali, library() memuatnya setiap kali kamu membuka R.

read_excel(): Dasar-dasarnya

Satu panggilan membaca sheet pertama dari sebuah workbook ke R:

library(readxl)

sales <- read_excel("sales.xlsx")
head(sales)
str(sales)

Kebiasaannya sama seperti impor apa pun: str() untuk memeriksa tipe setiap kolom, head() untuk melihat sekilas baris-baris pertama. Kalau file-nya tidak ditemukan, penyebabnya hampir selalu working directory: file.exists("sales.xlsx") memberi tahu dalam satu detik, dan solusinya sama seperti untuk file CSV: pakai path lengkap atau atur working directory ke folder file itu.

Yang kembali adalah tibble, versi data frame ala tidyverse. Untuk semua hal yang akan kamu lakukan sebagai pemula, tibble berperilaku persis seperti data frame (ia memang data frame, dengan tambahan): $ mengambil kolom, nrow() menghitung baris, dan ia bisa langsung dipakai dengan kata kerja dplyr. Perbedaan yang terlihat hanya soal tampilan, dan menyenangkan: ia hanya mencetak sepuluh baris pertama dengan tipe kolom di bawah namanya, alih-alih menumpahkan semuanya. Kalau ada fungsi lama yang bersikeras meminta data frame biasa, as.data.frame(sales) mengonversinya.

Memilih Sheet, Rentang, dan Melewati Baris Sampah

Workbook sungguhan jarang berupa satu tabel bersih yang dimulai dari sel A1. Argumen readxl menangani kekacauan yang biasa.

Sheet apa saja yang ada? Tanyakan dulu sebelum membaca:

excel_sheets("report.xlsx")
# [1] "Summary"  "Q1"  "Q2"  "Q3"  "Raw data"

sheet = memilih satu sheet, berdasarkan nama atau posisi:

q3 <- read_excel("report.xlsx", sheet = "Q3")
raw <- read_excel("report.xlsx", sheet = 5)

Utamakan nama: sheet = 5 diam-diam membaca sheet yang salah begitu seseorang mengubah urutan tab-nya.

range = membaca persegi panjang yang persis, dengan notasi Excel sendiri. Ini cara paling rapi untuk melewati baris logo, baris judul, dan catatan nyasar di sekitar tabel yang sebenarnya:

budget <- read_excel("budget.xlsx", range = "B4:E20")
budget <- read_excel("budget.xlsx", sheet = "Plan", range = "B4:E20")

skip = dan col_names = adalah alternatif yang lebih longgar ketika kamu tahu berapa baris sampah di atas data, tetapi tidak tahu di mana datanya berakhir:

# Data starts after 3 title rows, first real row is the header:
df <- read_excel("export.xlsx", skip = 3)

# No header row at all - supply names yourself:
df <- read_excel("export.xlsx", col_names = c("id", "region", "amount"))

col_names = TRUE (default) memakai baris pertama sebagai nama; FALSE membuat nama ...1, ...2 dan memperlakukan baris pertama sebagai data.

readxl memang dirancang hanya untuk membaca. Ketika rekan kerja menginginkan hasilmu dalam bentuk spreadsheet, jalur tercepatnya adalah writexl, satu baris tanpa dependensi:

install.packages("writexl")
writexl::write_xlsx(results, "results.xlsx")

Kalau kamu butuh lebih dari sekadar nilai mentah, seperti header tebal, panel yang dibekukan, warna sel, atau beberapa sheet berformat dalam satu workbook, itu wilayah openxlsx:

library(openxlsx)
write.xlsx(list(Summary = summary_df, Detail = detail_df), "report.xlsx")

List bernama menjadi satu sheet per elemen. openxlsx juga bisa membaca file Excel, jadi kamu akan melihatnya dipakai untuk kedua arah; untuk sekadar membaca, readxl tetap alat yang lebih sederhana.

Alternatif Pragmatis: Ekspor ke CSV

Kadang solusi yang paling sederhana justru menang. Kalau workbook-nya hanya sekali pakai (seseorang mengirimimu spreadsheet lewat email dan kamu butuh angkanya sekarang), buka di Excel, pakai "Save As" (atau "Simpan Sebagai") untuk mengekspor sheet itu sebagai CSV, lalu baca dengan alat yang sudah kamu kenal:

df <- read.csv("sales.csv")

Tanpa package, tanpa nama sheet, tanpa sel yang digabung. Alur lengkapnya ada di membaca CSV. Konsekuensinya: kamu kehilangan sheet lainnya, informasi yang bergantung pada format ikut hilang (warna sel yang "berarti" sesuatu, yang memang tanda desain data yang buruk), dan ekspornya adalah langkah manual yang akan dilupakan seseorang ketika file sumbernya diperbarui. Untuk pipeline yang berulang, baca .xlsx secara langsung; untuk impor sekali saja, CSV sungguh tidak masalah.

Jebakan Klasik Impor Excel

File Excel membawa masalah yang tidak dimiliki CSV, karena spreadsheet membiarkan manusia melakukan hal-hal yang tidak seharusnya dilakukan pada tabel.

Tanggal datang sebagai angka. Excel menyimpan tanggal sebagai hitungan hari berurutan, dan kalau sebuah kolom mencampur tipe atau diformat dengan aneh, kamu bisa mendapat 44688 padahal mengharapkan tanggal. readxl biasanya mengonversi sel tanggal sungguhan dengan benar, tetapi ketika kamu mendapat angka mentahnya, konversikan dengan epoch Excel, yaitu 1899-12-30, bukan 1970:

as.Date(44688, origin = "1899-12-30")
# [1] "2022-05-07"

Sel yang digabung terurai menjadi sel kosong. Header yang digabung melintasi tiga kolom kembali sebagai satu nilai dan dua sel kosong; label kategori yang digabung ke bawah sepanjang sepuluh baris menjadi satu nilai dan sembilan nilai hilang. readxl tidak bisa memulihkan maksud yang hanya ada secara visual, jadi bersiaplah mengisi celah itu sendiri setelah impor.

Satu sel nyasar mengubah kolom menjadi teks. Tipe kolom ditebak dari datanya, jadi satu "n/a", catatan yang diketik di antara angka, atau spasi di sel yang "kosong" membuat seluruh kolom kembali sebagai character. str() tepat setelah membaca akan menangkap hal ini; argumen col_types (misalnya col_types = c("text", "numeric", "date")) memaksakan tipenya ketika tebakannya terus salah.

Intinya: spreadsheet adalah kanvas tempat orang menggambar, bukan tabel. Bacalah dengan sikap skeptis, jalankan str(), dan cocokkan beberapa nilai dengan aslinya sebelum memercayai hasil impornya.

Yang Perlu Kamu Ingat

  • R dasar tidak bisa membaca .xlsx: instal readxl, lalu read_excel("file.xlsx").
  • excel_sheets() mendaftar isi sebuah workbook; sheet = (utamakan nama) memilih satu sheet; range = "B4:E20" memotong tepat tabel yang kamu inginkan.
  • Yang kamu dapat adalah tibble, data frame dengan tampilan cetak yang lebih rapi.
  • Menulis memakai package lain: writexl::write_xlsx() untuk output biasa, openxlsx untuk workbook berformat.
  • Untuk sekali pakai, mengekspor CSV dari Excel lalu memakai read.csv() adalah jalan pintas yang sah.
  • Waspadai tiga jebakan klasik: tanggal sebagai angka berurutan (origin 1899-12-30), sel yang digabung menjadi kosong, dan satu sel buruk yang menyeret kolom menjadi teks.

Berikutnya: arah sebaliknya, yaitu menulis data frame-mu ke file CSV dan RDS.

Pertanyaan yang sering diajukan

Bagaimana cara membaca file Excel di R?

Instal package readxl sekali dengan install.packages("readxl"), muat dengan library(readxl), lalu panggil read_excel("file.xlsx"). Fungsi ini mengembalikan tibble (data frame modern) yang dibuat dari sheet pertama. Pakai argumen sheet = untuk membaca sheet lain berdasarkan nama atau posisi.

Apakah R bisa membaca file Excel tanpa package?

Tidak. R dasar tidak punya pembaca untuk .xlsx atau .xls, karena keduanya format biner/terkompresi, bukan teks. Kamu bisa memakai package (readxl adalah standarnya; openxlsx juga bisa) atau mengekspor sheet-nya dari Excel sebagai CSV lalu memakai read.csv(), yang sama sekali tidak butuh package.

Bagaimana cara membaca sheet tertentu dari file Excel di R?

Berikan sheet = ke read_excel: read_excel("report.xlsx", sheet = "Q3") berdasarkan nama, atau sheet = 3 berdasarkan posisi. Kalau kamu tidak tahu isi workbook-nya, excel_sheets("report.xlsx") mengembalikan semua nama sheet sebagai vector character.

Bagaimana cara menulis file Excel dari R?

readxl hanya bisa membaca. Untuk menulis, cara satu barisnya adalah writexl::write_xlsx(df, "out.xlsx"). Kalau kamu butuh format, seperti warna, lebar kolom, atau beberapa sheet bergaya, pakai package openxlsx, yang bisa membuat workbook bergaya lewat kode.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai