Data Frame dan Manipulasi Dasar di R dengan 20 Contoh Kode
Blog/Tips & Trik/Data Frame dan Manipulasi Dasar di R dengan 20 Contoh Kode

Data Frame dan Manipulasi Dasar di R dengan 20 Contoh Kode

BimaBima
·8 November 2025·12 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

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.

KotaTotal penjualanPorsi
BandungRp 118.960.00033,4%
SurabayaRp 79.650.00022,3%
JakartaRp 62.140.00017,4%
MedanRp 41.820.00011,7%
SemarangRp 25.310.0007,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 nrow sebelum 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.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Pandas groupby: Agregasi Data ala Pivot di Python (2026)
Tips & Trik
20 Juli 2026•9 menit baca

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.

BimaBima
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
Tips & Trik
18 Juli 2026•8 menit baca

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.

BimaBima
Pandas read_excel: Baca File Excel di Python
Tips & Trik
16 Juli 2026•8 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore