Data Frame dan Manipulasi Dasar di R dengan 20 Contoh Kode
TL;DR
Data frame adalah struktur tabel di R, tiap kolom boleh punya tipe data berbeda tapi panjangnya harus sama. Dengan fungsi bawaan R kamu udah bisa milih baris, nambah kolom, ngurutkan, ngelompokkan pakai aggregate, dan nggabung tabel pakai merge. Dua puluh contoh di artikel ini bisa langsung ditempel ke konsol R tanpa install paket apa pun.
Data frame adalah struktur tabel di R. Tiap kolom boleh punya tipe data sendiri, tapi jumlah barisnya harus sama.
Kalau kamu udah biasa kerja di spreadsheet, konsepnya sama: baris itu transaksi, kolom itu atribut. Bedanya semua langkah pengolahan tertulis sebagai kode, jadi bisa diulang bulan depan tanpa klik-klik lagi.
Dua puluh contoh di bawah pakai fungsi bawaan R. Nggak ada paket yang perlu diinstall, dan semuanya bisa langsung ditempel ke konsol.
Data contoh yang dipakai
Semua contoh jalan di atas data frame ini. Tempel dulu potongan kode berikut sebelum lanjut.
penjualan <- data.frame(
id_transaksi = c(1001, 1002, 1003, 1004, 1005),
tanggal = as.Date(c("2025-11-01", "2025-11-01",
"2025-11-02", "2025-11-02", "2025-11-03")),
kota = c("Bandung", "Surabaya", "Bandung", "Medan", "Surabaya"),
produk = c("Kopi Bubuk", "Teh Celup", "Kopi Bubuk",
"Gula Aren", "Kopi Bubuk"),
qty = c(3, 5, 2, 4, 6),
harga = c(28000, 12000, 28000, 18000, 28000),
stringsAsFactors = FALSE
)
Contoh 1 sampai 5: kenalan sama isi tabel
1. Lihat struktur data frame. Ini perintah pertama yang aku jalanin tiap ketemu data baru.
str(penjualan)
# 'data.frame': 5 obs. of 6 variables:
# $ id_transaksi: num 1001 1002 1003 1004 1005
# $ tanggal : Date, format: "2025-11-01" ...
# $ kota : chr "Bandung" "Surabaya" ...
2. Intip beberapa baris pertama.
head(penjualan, 3)
tail(penjualan, 2)
3. Cek ukuran tabel.
dim(penjualan) # 5 6
nrow(penjualan) # 5
ncol(penjualan) # 6
4. Lihat dan ganti nama kolom.
names(penjualan)
names(penjualan)[6] <- "harga_satuan"
5. Ringkasan angka per kolom.
summary(penjualan$qty)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 2 3 4 4 5 6
Perhatiin nilai median dan mean-nya. Kalau dua angka ini beda jauh, biasanya ada nilai ekstrem di data kamu.
Contoh 6 sampai 10: milih baris dan kolom
6. Ambil satu kolom. Tanda dolar ngasih vektor, kurung siku ganda juga.
penjualan$kota
penjualan[["kota"]]
7. Ambil beberapa kolom sekaligus.
penjualan[, c("kota", "qty", "harga_satuan")]
8. Ambil baris berdasarkan posisi. Format umumnya df[baris, kolom].
penjualan[1:3, ]
penjualan[c(2, 5), c("kota", "qty")]
9. Saring baris pakai kondisi.
penjualan[penjualan$kota == "Bandung", ]
penjualan[penjualan$qty >= 4, ]
10. Saring pakai subset supaya lebih kebaca.
subset(penjualan,
kota == "Surabaya" & qty > 4,
select = c(tanggal, produk, qty))
Fungsi subset ini padanan paling dekat dari filter di spreadsheet. Kalau di Excel kamu biasa pakai SUMIFS buat nyaring sambil menjumlah, di R dua langkah itu dipisah.
Contoh 11 sampai 15: ubah isi tabel
11. Tambah kolom hitungan.
penjualan$total <- penjualan$qty * penjualan$harga_satuan
head(penjualan$total)
# 84000 60000 56000 72000 168000
12. Tambah kolom bersyarat. Fungsi ifelse jalan per elemen.
penjualan$segmen <- ifelse(penjualan$total >= 80000,
"besar", "kecil")
13. Hapus kolom. Kasih nilai NULL.
penjualan$segmen <- NULL
14. Urutkan baris. Tanda minus buat urutan menurun.
penjualan[order(-penjualan$total), ]
penjualan[order(penjualan$kota, -penjualan$qty), ]
15. Ganti nilai tertentu.
penjualan$kota[penjualan$kota == "Medan"] <- "Medan Kota"
Cek hasilnya sebelum lanjut. Perintah pengganti nilai itu yang paling sering bikin data rusak diam-diam kalau kondisinya kelewat luas.
Contoh 16 sampai 20: ringkas dan gabung
16. Hitung frekuensi.
table(penjualan$kota)
table(penjualan$kota, penjualan$produk)
17. Agregasi per kelompok. Ini padanan GROUP BY di SQL.
aggregate(total ~ kota, data = penjualan, FUN = sum)
# kota total
# 1 Bandung 140000
# 2 Medan Kota 72000
# 3 Surabaya 228000
Kamu bisa pakai lebih dari satu pengelompok dan ganti fungsi ringkasnya.
aggregate(qty ~ kota + produk, data = penjualan, FUN = mean)
Konsep di balik sum, mean, dan length di sini sama dengan aggregate function di SQL.
18. Gabung dua tabel.
master_produk <- data.frame(
produk = c("Kopi Bubuk", "Teh Celup", "Gula Aren"),
kategori = c("Minuman", "Minuman", "Bahan Pokok"),
stringsAsFactors = FALSE
)
gabung <- merge(penjualan, master_produk,
by = "produk", all.x = TRUE)
Argumen all.x = TRUE bikin semua baris penjualan tetap ada walau produknya nggak ketemu di master. Ini setara LEFT JOIN.
19. Tangani nilai kosong.
sum(is.na(penjualan$qty)) # berapa yang kosong
penjualan_bersih <- na.omit(penjualan)
sum(penjualan$total, na.rm = TRUE) # abaikan NA saat menjumlah
Jangan buru-buru pakai na.omit. Hitung dulu berapa baris yang kebuang, karena itu bagian dari pemeriksaan data quality.
20. Baca dan simpan CSV.
penjualan <- read.csv("data/penjualan.csv",
stringsAsFactors = FALSE)
write.csv(hasil, "output/rekap_kota.csv", row.names = FALSE)
Argumen row.names = FALSE penting biar file hasilnya nggak dapat kolom nomor tambahan yang bikin bingung waktu dibuka di Excel.
Penjelasan resmi tiap fungsi di atas bisa kamu cek di manual pengantar R di CRAN, atau ketik tanda tanya sebelum nama fungsi, misalnya ?aggregate.
Contoh kasus: rekap penjualan toko_berkah di R
Dataset latihan toko_berkah punya 18.412 baris transaksi Januari sampai Juni 2025. Ini alur pengolahannya dari file mentah sampai rekap per kota.
trx <- read.csv("toko_berkah.csv", stringsAsFactors = FALSE)
trx$tanggal <- as.Date(trx$tanggal)
trx$total <- trx$qty * trx$harga_satuan
# buang transaksi batal
trx <- subset(trx, status == "selesai")
# rekap per kota
rekap <- aggregate(total ~ kota, data = trx, FUN = sum)
rekap <- rekap[order(-rekap$total), ]
# porsi kontribusi
rekap$porsi <- round(100 * rekap$total / sum(rekap$total), 1)
head(rekap, 5)
Hasilnya bikin aku berhenti sebentar.
| Kota | Total penjualan | Porsi |
|---|---|---|
| Bandung | Rp 118.960.000 | 33,4% |
| Surabaya | Rp 79.650.000 | 22,3% |
| Jakarta | Rp 62.140.000 | 17,4% |
| Medan | Rp 41.820.000 | 11,7% |
| Semarang | Rp 25.310.000 | 7,1% |
Lima kota teratas nyumbang 91,9% penjualan. Sisa 8,1% tersebar di 23 kota lain, dan rata-rata tiap kota itu cuma nyumbang Rp 1.240.000 selama enam bulan.
Angka terakhir itu yang berguna. Biaya kirim ke 23 kota kecil ternyata lebih besar dari marginnya, dan itu ketahuan cuma dari empat baris kode agregasi.
Kalau data kamu berasal dari export marketplace, langkah pembersihannya bisa kamu ikutin dari tulisan soal ngolah export marketplace jadi laporan sebelum masuk ke R.
Kesalahan umum pemula R
- Lupa koma di kurung siku.
penjualan[1:3]ngambil kolom,penjualan[1:3, ]ngambil baris. Beda hasil, sama-sama nggak error. - Pakai tanda sama dengan tunggal buat perbandingan. Perbandingan pakai
==. Satu sama dengan itu penugasan nilai. - Ngira NA sama dengan nol. NA artinya nilainya nggak diketahui, dan semua hitungan yang nyentuh NA hasilnya NA.
- Nimpa data frame asli. Simpan hasil olahan ke nama baru sampai kamu yakin langkahnya benar.
- Ngeluh factor bikin repot. Sejak R 4.0.0 teks nggak otomatis jadi factor lagi. Kalau masih kejadian, cek versi R kamu pakai
R.version.string. - Nggak ngecek jumlah baris setelah merge. Kalau kunci gabungnya nggak unik, jumlah baris bisa melonjak tanpa peringatan. Selalu bandingin
nrowsebelum dan sesudah.
Poin terakhir itu masalah yang sama persis dengan yang aku bahas di tulisan data observability, cuma skalanya lebih kecil.
FAQ
Apa bedanya data frame dan matrix di R?
Matrix cuma boleh nampung satu tipe data untuk seluruh isinya, misalnya semua angka. Data frame boleh nyampur, jadi kolom nama produk bisa teks sementara kolom qty berupa angka. Untuk data penjualan atau survei yang kolomnya campur, data frame hampir selalu pilihan yang benar.
Perlu install dplyr buat mulai belajar R?
Nggak perlu di awal. Fungsi bawaan R kayak subset, aggregate, order, dan merge udah cukup buat mayoritas pengolahan data harian. Belajar versi bawaannya dulu bikin kamu ngerti apa yang sebenarnya terjadi. Setelah itu pindah ke dplyr terasa lebih gampang karena kamu udah tau konsepnya.
Kenapa kolom teksku berubah jadi factor?
Di R versi lama, data.frame dan read.csv otomatis ngubah teks jadi factor. Sejak R 4.0.0 perilaku ini udah diubah jadi teks biasa. Kalau kamu masih ketemu masalah ini, tambahin argumen stringsAsFactors = FALSE waktu bikin data frame atau baca file, dan cek versi R kamu pakai R.version.string.
Gimana cara ngitung total per kelompok di R?
Pakai aggregate dengan rumus berbentuk nilai ~ pengelompok. Contohnya aggregate(total ~ kota, data = penjualan, FUN = sum) ngasih total penjualan per kota. Kamu bisa pakai lebih dari satu pengelompok dengan tanda tambah, misalnya total ~ kota + produk, dan ganti FUN jadi mean atau length sesuai kebutuhan.
Kenapa hasil sum-ku jadi NA?
Karena ada nilai kosong di kolomnya. Di R, penjumlahan yang melibatkan NA hasilnya ikut NA supaya kamu sadar datanya nggak lengkap. Tambahin argumen na.rm = TRUE buat ngabaikan nilai kosong, misalnya sum(penjualan$qty, na.rm = TRUE). Cek dulu berapa banyak yang kosong pakai sum(is.na(penjualan$qty)) sebelum ngabaikan.
Penutup
Tiga hal yang paling sering kamu pakai dari daftar tadi: subset buat nyaring, aggregate buat ngelompokkan, dan merge buat nyambung tabel. Tiga fungsi itu aja udah nutup mayoritas kerjaan rekap harian.
Coba ambil satu file CSV penjualan kamu sore ini. Baca pakai read.csv, tambah kolom total, lalu jalankan satu aggregate per kota. Lima menit, dan kamu udah punya rekap yang bisa diulang bulan depan.
Kalau kamu mau ngerti konsep pengelompokan datanya lebih dalam, kulik latihan GROUP BY di NgulikSQL. Pola pikirnya sama persis dengan aggregate di R.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.