Sebuah kantin menjual 6 menu makanan dan 4 menu minuman. Selama satu hari terjadi 14 transaksi. Setiap transaksi berisi satu jenis makanan dan, kadang, satu jenis minuman. Aturan promo kantin:
| Total pesanan | Promo |
|---|---|
| Kurang dari Rp20.000 | Harga normal |
| Rp20.000 atau lebih | Diskon 5% |
| Rp30.000 atau lebih | Diskon 5% dan gratis satu Es Teh |
Tugas program: menghitung total pesanan tiap transaksi, menentukan promonya, lalu menghitung total yang harus dibayar pelanggan.
| Konsep | Penjelasan |
|---|---|
| Vector | Kumpulan nilai bertipe sama, dibuat dengan c() |
| Data frame | Tabel; tiap kolom adalah vector dengan panjang sama |
| Akses kolom | nama_tabel$nama_kolom |
| Indexing | harga[c(1, 4, 4)] mengambil elemen ke-1, ke-4, dan
ke-4 |
NA |
Data kosong; hitungan yang melibatkan NA menghasilkan
NA |
ifelse() |
ifelse(kondisi, nilai_jika_benar, nilai_jika_salah),
bekerja pada seluruh vector sekaligus |
makanan_terjual dan minuman_terjual berisi
nomor menu, bukan nama. Kolom jml_...
berisi jumlah porsi. Transaksi ke-1 dan ke-12 tidak membeli minuman,
sehingga diisi NA.
Contoh membaca baris ke-3: menu nomor 3 (Mie Ayam) sebanyak 2 porsi dan menu nomor 7 (Es Teh) sebanyak 2 gelas.
kode_transaksi <- c(paste0("T0", 1:14))
makanan_terjual <- c(1, 4, 3, 4, 2, 4, 5, 5, 1, 4, 6, 6, 3, 1)
jml_makanan_terjual <- c(1, 1, 2, 1, 2, 2, 1, 3, 1, 3, 2, 1, 2, 3)
minuman_terjual <- c(NA, 7, 7, 10, 8, 7, 9, 9, 7, 10, 7, NA, 8, 8)
jml_minuman_terjual <- c(NA, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, NA, 1, 1)
penjualan <- data.frame(kode_transaksi,
makanan_terjual, jml_makanan_terjual,
minuman_terjual, jml_minuman_terjual)
penjualan
## kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1 T01 1 1 NA
## 2 T02 4 1 7
## 3 T03 3 2 7
## 4 T04 4 1 10
## 5 T05 2 2 8
## 6 T06 4 2 7
## 7 T07 5 1 9
## 8 T08 5 3 9
## 9 T09 1 1 7
## 10 T010 4 3 10
## 11 T011 6 2 7
## 12 T012 6 1 NA
## 13 T013 3 2 8
## 14 T014 1 3 8
## jml_minuman_terjual
## 1 NA
## 2 1
## 3 2
## 4 1
## 5 2
## 6 2
## 7 1
## 8 2
## 9 1
## 10 2
## 11 2
## 12 NA
## 13 1
## 14 1
harga[penjualan$makanan_terjual] mengambil harga satuan
tiap transaksilalu dikalikan jumlah porsi. Karena harga[NA]
bernilai NA, transaksi tanpa minuman akan bernilai
NA pada total_minuman.
penjualan$total_makanan <- harga[penjualan$makanan_terjual] * penjualan$jml_makanan_terjual
penjualan$total_minuman <- harga[penjualan$minuman_terjual] * penjualan$jml_minuman_terjual
penjualan
## kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1 T01 1 1 NA
## 2 T02 4 1 7
## 3 T03 3 2 7
## 4 T04 4 1 10
## 5 T05 2 2 8
## 6 T06 4 2 7
## 7 T07 5 1 9
## 8 T08 5 3 9
## 9 T09 1 1 7
## 10 T010 4 3 10
## 11 T011 6 2 7
## 12 T012 6 1 NA
## 13 T013 3 2 8
## 14 T014 1 3 8
## jml_minuman_terjual total_makanan total_minuman
## 1 NA 7000 NA
## 2 1 12000 3000
## 3 2 16000 6000
## 4 1 12000 4000
## 5 2 24000 8000
## 6 2 24000 6000
## 7 1 13000 5000
## 8 2 39000 10000
## 9 1 7000 3000
## 10 2 36000 8000
## 11 2 12000 6000
## 12 NA 6000 NA
## 13 1 16000 4000
## 14 1 21000 4000
is.na() bernilai TRUE pada elemen kosong,
lalu ifelse() menggantinya dengan 0. Tanpa langkah ini,
total pesanan transaksi 1 dan 12 menjadi NA.
total_minuman_bersih <- ifelse(is.na(penjualan$total_minuman), 0, penjualan$total_minuman)
penjualan$total_pesan <- penjualan$total_makanan + total_minuman_bersih
penjualan
## kode_transaksi makanan_terjual jml_makanan_terjual minuman_terjual
## 1 T01 1 1 NA
## 2 T02 4 1 7
## 3 T03 3 2 7
## 4 T04 4 1 10
## 5 T05 2 2 8
## 6 T06 4 2 7
## 7 T07 5 1 9
## 8 T08 5 3 9
## 9 T09 1 1 7
## 10 T010 4 3 10
## 11 T011 6 2 7
## 12 T012 6 1 NA
## 13 T013 3 2 8
## 14 T014 1 3 8
## jml_minuman_terjual total_makanan total_minuman total_pesan
## 1 NA 7000 NA 7000
## 2 1 12000 3000 15000
## 3 2 16000 6000 22000
## 4 1 12000 4000 16000
## 5 2 24000 8000 32000
## 6 2 24000 6000 30000
## 7 1 13000 5000 18000
## 8 2 39000 10000 49000
## 9 1 7000 3000 10000
## 10 2 36000 8000 44000
## 11 2 12000 6000 18000
## 12 NA 6000 NA 6000
## 13 1 16000 4000 20000
## 14 1 21000 4000 25000
diskon bernilai 0,05 jika total pesanan minimal
Rp20.000, selain itu 0.esteh_gratis bernilai 1 jika total pesanan minimal
Rp30.000. Kolom ini hanya penanda dan tidak mengurangi total bayar.total_bayar = total pesanan x (1 - diskon).keterangan memakai ifelse bertingkat.
Syarat terbesar (Rp30.000) diperiksa lebih dulu, karena transaksi di
atas Rp30.000 juga memenuhi syarat Rp20.000.rekap <- data.frame(kode_transaksi, penjualan$total_pesan)
rekap$total_pesan <- penjualan$total_pesan
rekap$diskon <- ifelse(rekap$total_pesan >= 20000, 0.05, 0)
rekap$esteh_gratis <- ifelse(rekap$total_pesan >= 30000, 1, 0)
rekap$total_bayar <- rekap$total_pesan * (1 - rekap$diskon)
rekap$keterangan <- ifelse(rekap$total_pesan >= 30000, "Diskon 5% + Gratis Es Teh",
ifelse(rekap$total_pesan >= 20000, "Diskon 5%", "Harga Normal"))
rekap
## kode_transaksi penjualan.total_pesan total_pesan diskon esteh_gratis
## 1 T01 7000 7000 0.00 0
## 2 T02 15000 15000 0.00 0
## 3 T03 22000 22000 0.05 0
## 4 T04 16000 16000 0.00 0
## 5 T05 32000 32000 0.05 1
## 6 T06 30000 30000 0.05 1
## 7 T07 18000 18000 0.00 0
## 8 T08 49000 49000 0.05 1
## 9 T09 10000 10000 0.00 0
## 10 T010 44000 44000 0.05 1
## 11 T011 18000 18000 0.00 0
## 12 T012 6000 6000 0.00 0
## 13 T013 20000 20000 0.05 0
## 14 T014 25000 25000 0.05 0
## total_bayar keterangan
## 1 7000 Harga Normal
## 2 15000 Harga Normal
## 3 20900 Diskon 5%
## 4 16000 Harga Normal
## 5 30400 Diskon 5% + Gratis Es Teh
## 6 28500 Diskon 5% + Gratis Es Teh
## 7 18000 Harga Normal
## 8 46550 Diskon 5% + Gratis Es Teh
## 9 10000 Harga Normal
## 10 41800 Diskon 5% + Gratis Es Teh
## 11 18000 Harga Normal
## 12 6000 Harga Normal
## 13 19000 Diskon 5%
## 14 23750 Diskon 5%
rekap_total)Satu baris data frame yang merangkum seluruh transaksi hari itu:
| Kolom | Rumus | Arti |
|---|---|---|
total_transaksi |
nrow(rekap) |
Jumlah transaksi (jumlah baris) |
total_pesanan |
sum(rekap$total_pesan) |
Jumlah nilai pesanan sebelum diskon |
total_diskon |
sum(rekap$total_pesan * rekap$diskon) |
Total rupiah potongan diskon |
total_pendapatan |
sum(rekap$total_bayar) |
Total uang yang diterima kantin |
transaksi_diskon |
sum(rekap$diskon > 0) |
Banyak transaksi yang mendapat diskon |
transaksi_esteh |
sum(rekap$esteh_gratis) |
Banyak transaksi yang mendapat Es Teh gratis |
rekap$diskon > 0 menghasilkan vector
TRUE/FALSE, dan sum() menghitung
TRUE sebagai 1, sehingga hasilnya adalah banyaknya
transaksi yang memenuhi syarat.
rekap_total <- data.frame(
total_transaksi = nrow(rekap),
total_pesanan = sum(rekap$total_pesan),
total_diskon = sum(rekap$total_pesan * rekap$diskon),
total_pendapatan = sum(rekap$total_bayar),
transaksi_diskon = sum(rekap$diskon > 0),
transaksi_esteh = sum(rekap$esteh_gratis)
)
rekap_total
## total_transaksi total_pesanan total_diskon total_pendapatan transaksi_diskon
## 1 14 312000 11100 300900 7
## transaksi_esteh
## 1 4
Isi rekap (nilai dihitung dari data pada program):
| kode_transaksi | total_pesan | diskon | esteh_gratis | total_bayar | keterangan |
|---|---|---|---|---|---|
| T01 | 7000 | 0 | 0 | 7000 | Harga Normal |
| T02 | 15000 | 0 | 0 | 15000 | Harga Normal |
| T03 | 22000 | 0,05 | 0 | 20900 | Diskon 5% |
| T04 | 16000 | 0 | 0 | 16000 | Harga Normal |
| T05 | 32000 | 0,05 | 1 | 30400 | Diskon 5% + Gratis Es Teh |
| T06 | 30000 | 0,05 | 1 | 28500 | Diskon 5% + Gratis Es Teh |
| T07 | 18000 | 0 | 0 | 18000 | Harga Normal |
| T08 | 49000 | 0,05 | 1 | 46550 | Diskon 5% + Gratis Es Teh |
| T09 | 10000 | 0 | 0 | 10000 | Harga Normal |
| T010 | 44000 | 0,05 | 1 | 41800 | Diskon 5% + Gratis Es Teh |
| T011 | 18000 | 0 | 0 | 18000 | Harga Normal |
| T012 | 6000 | 0 | 0 | 6000 | Harga Normal |
| T013 | 20000 | 0,05 | 0 | 19000 | Diskon 5% |
| T014 | 25000 | 0,05 | 0 | 23750 | Diskon 5% |
Isi rekap_total:
| total_transaksi | total_pesanan | total_diskon | total_pendapatan | transaksi_diskon | transaksi_esteh |
|---|---|---|---|---|---|
| 14 | 312000 | 11100 | 300900 | 7 | 4 |
| Konsep | Fungsi / sintaks | Dipakai untuk |
|---|---|---|
| Membuat vector | c(), paste0() |
Data menu dan transaksi |
| Membuat tabel | data.frame() |
menu, penjualan, rekap,
rekap_total |
| Akses kolom | $ |
Membaca dan menambah kolom |
| Indexing vector | harga[nomor_menu] |
Mencari harga dari nomor menu |
| Deteksi data kosong | is.na() |
Transaksi tanpa minuman |
| Percabangan vektor | ifelse() |
Mengganti NA, diskon, keterangan |
| Ringkasan | sum(), nrow() |
Total dan jumlah transaksi (rekap_total) |
Alur program: data menu, data transaksi, total makanan dan minuman,
total pesanan (NA diganti 0), diskon dan promo, total bayar, lalu
ringkasan keseluruhan (rekap_total).