Setelah menyelesaikan praktikum ini, mahasiswa mampu:
c(), rep(), dan operator :.if,
else if, else, ifelse(), dan
ifelse() bertingkat (nested).Sebuah restoran mencatat transaksi 15 pelanggan dalam satu hari. Setiap transaksi memuat pembelian makanan dan minuman, serta status pelanggan (member atau non-member). Pemilik restoran ingin menghitung harga akhir yang harus dibayar setiap pelanggan dengan aturan berikut.
Aturan pajak
Aturan diskon
Diskon dihitung dari dua komponen yang dijumlahkan:
| Komponen | Syarat | Diskon |
|---|---|---|
| Diskon member | Status = member | 2% |
| Diskon nominal belanja (berdasarkan total harga setelah pajak) | Total ≤ Rp100.000 | 0% |
| Rp100.000 < Total ≤ Rp150.000 | 5% | |
| Rp150.000 < Total ≤ Rp200.000 | 10% | |
| Total > Rp200.000 | 15% |
Diskon dikenakan pada total harga setelah pajak.
Pertanyaan utama: berapa harga akhir yang harus dibayar masing-masing pelanggan, dan berapa total pendapatan restoran hari itu?
Data mentah → Subtotal & pajak → Total harga → Diskon (percabangan) → Harga akhir
Variabel adalah nama yang menyimpan nilai. Di R,
pemberian nilai memakai operator <- (boleh juga
=). Tipe data dasar yang sering dipakai:
| Tipe | Contoh | Fungsi cek |
|---|---|---|
numeric |
183000, 0.11 |
is.numeric() |
integer |
15L |
is.integer() |
character |
"ali", "member" |
is.character() |
logical |
TRUE, FALSE |
is.logical() |
Misalkan satu transaksi pelanggan bernama Ali:
nama_pelanggan <- "ali"
status_pelanggan <- "member"
makanan_ali <- 183000
minuman_ali <- 42000
tarif_pajak <- 0.11
# cek tipe data
class(nama_pelanggan)## [1] "character"
## [1] "numeric"
## [1] TRUE
Perhitungan untuk satu pelanggan:
subtotal_ali <- makanan_ali + minuman_ali
pajak_ali <- subtotal_ali * tarif_pajak
total_ali <- subtotal_ali + pajak_ali
subtotal_ali## [1] 225000
## [1] 24750
## [1] 249750
Catatan: nama variabel di R bersifat case sensitive (
Totalberbeda dengantotal), tidak boleh diawali angka, dan sebaiknya deskriptif.
Menyimpan data 15 pelanggan dengan 15 variabel terpisah tidak efisien. Vektor menyimpan banyak nilai bertipe sama dalam satu objek. Cara membuatnya:
c() : menggabungkan nilai (combine)a:b : barisan bilangan bulat dari a sampai
brep(x, times) : mengulang nilai x sebanyak
times kalino <- c(1:15)
nama <- c("ali", "budi", "eka", "dani", "rahmat", "muharram", "rizki", "rizal",
"eko", "galang", "bambang", "dwi", "tsabita", "ikrima", "rini")
status <- c(rep("member", 8), rep("non-member", 7))
makanan <- c(183000, 48000, 26000, 90000, 82000, 77000, 55000, 46000,
193000, 159000, 42000, 171000, 128000, 28000, 27000)
minuman <- c(42000, 12000, 43000, 42000, 23000, 49000, 40000, 13000,
30000, 23000, 12000, 34000, 9000, 33000, 14000)Pelanggan nomor 1 sampai 8 berstatus member, nomor 9 sampai 15 non-member.
Elemen diakses dengan tanda kurung siku [ ] (indeks
dimulai dari 1).
## [1] "eka"
## [1] 183000 48000 26000 90000 82000
## [1] "ali" "eko"
## [1] 15
## [1] 1355000
## [1] 27933.33
## [1] 193000
## [1] 9000
Operasi aritmatika pada vektor dilakukan elemen per elemen. Dengan satu perintah, R menghitung seluruh 15 pelanggan sekaligus (vectorization), tanpa perlu mengulang satu per satu.
| Operator | Fungsi |
|---|---|
+ - |
tambah, kurang |
* / |
kali, bagi |
^ |
pangkat |
%% |
sisa bagi |
subtotal_harga <- makanan + minuman
pajak <- subtotal_harga * 0.11
ttl_hrg <- subtotal_harga + pajak
head(subtotal_harga)## [1] 225000 60000 69000 132000 105000 126000
## [1] 24750 6600 7590 14520 11550 13860
## [1] 249750 66600 76590 146520 116550 139860
Pada baris pajak, nilai tunggal 0.11
otomatis “diulang” untuk seluruh elemen (recycling rule).
Data frame adalah tabel: setiap kolom adalah vektor
(boleh berbeda tipe), setiap baris adalah satu pengamatan. Dibuat dengan
data.frame().
## [1] "ali" "budi" "eka" "dani" "rahmat" "muharram"
## [7] "rizki" "rizal" "eko" "galang" "bambang" "dwi"
## [13] "tsabita" "ikrima" "rini"
## [1] 15
## [1] 7
## 'data.frame': 15 obs. of 7 variables:
## $ no : int 1 2 3 4 5 6 7 8 9 10 ...
## $ nama : chr "ali" "budi" "eka" "dani" ...
## $ status : chr "member" "member" "member" "member" ...
## $ makanan: num 183000 48000 26000 90000 82000 77000 55000 46000 193000 159000 ...
## $ minuman: num 42000 12000 43000 42000 23000 49000 40000 13000 30000 23000 ...
## $ pajak : num 24750 6600 7590 14520 11550 ...
## $ ttl_hrg: num 249750 66600 76590 146520 116550 ...
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 45510 67155 116550 131276 177045 249750
Operator perbandingan menghasilkan nilai logika TRUE
atau FALSE.
| Operator | Arti | Operator | Arti |
|---|---|---|---|
== |
sama dengan | != |
tidak sama dengan |
< |
kurang dari | > |
lebih dari |
<= |
kurang dari atau sama dengan | >= |
lebih dari atau sama dengan |
& |
DAN (AND) | \| |
ATAU (OR) |
! |
negasi (NOT) |
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE
## [1] TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE
## [13] TRUE FALSE FALSE
## [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE
Vektor logika dapat dipakai untuk menyaring data:
## [1] "ali" "eko" "galang" "dwi" "tsabita"
## [1] 8
Percabangan memungkinkan program memilih tindakan berdasarkan kondisi. Pada kasus ini, besar diskon bergantung pada status pelanggan dan total harga.
if,
else if, dan else (untuk satu nilai)Bentuk umum:
if (kondisi_1) {
# dijalankan jika kondisi_1 TRUE
} else if (kondisi_2) {
# dijalankan jika kondisi_1 FALSE dan kondisi_2 TRUE
} else {
# dijalankan jika semua kondisi FALSE
}Contoh: diskon nominal untuk satu pelanggan (Ali, total 249.750).
total <- total_ali
if (total <= 100000) {
diskon_nominal <- 0
} else if (total <= 150000) {
diskon_nominal <- 0.05
} else if (total <= 200000) {
diskon_nominal <- 0.10
} else {
diskon_nominal <- 0.15
}
diskon_nominal## [1] 0.15
Diskon member untuk pelanggan yang sama:
status_pelanggan <- "member"
if (status_pelanggan == "member") {
diskon_member <- 0.02
} else {
diskon_member <- 0
}
diskon_member## [1] 0.02
## [1] 0.17
Penting:
ifhanya menerima satu nilaiTRUE/FALSE. Jika diberi vektor berisi banyak elemen, R akan memberi galat (error). Untuk vektor, gunakanifelse().
ifelse()
(untuk vektor)Bentuk:
ifelse(kondisi, nilai_jika_TRUE, nilai_jika_FALSE). Fungsi
ini memeriksa setiap elemen vektor.
diskon <- c(rep(0, 15)) # diskon awal 0 untuk semua pelanggan
diskonmem <- ifelse(status == "member", diskon + 0.02, diskon + 0)
diskonmem## [1] 0.02 0.02 0.02 0.02 0.02 0.02 0.02 0.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00
ifelse()
Bertingkat (Nested)Untuk lebih dari dua kemungkinan, ifelse() dapat
ditumpuk:
diskontotal <- ifelse(ttl_hrg <= 100000, diskonmem + 0,
ifelse(ttl_hrg <= 150000, diskonmem + 0.05,
ifelse(ttl_hrg <= 200000, diskonmem + 0.10,
diskonmem + 0.15)))
diskontotal## [1] 0.17 0.02 0.02 0.07 0.07 0.07 0.07 0.02 0.15 0.15 0.00 0.15 0.10 0.00 0.00
Cara membacanya: R memeriksa kondisi dari atas ke bawah. Kondisi pertama yang terpenuhi menentukan hasilnya.
hrg_akhir <- ttl_hrg - (ttl_hrg * diskontotal)
tabel_hrg <- data.frame(no, nama, status, makanan, minuman, pajak,
ttl_hrg, diskontotal, hrg_akhir)
tabel_hrgif/else if/else, lalu cocokkan
dengan hasil di tabel_hrg.kategori pada tabel_hrg dengan
ifelse() bertingkat: "Hemat" jika
ttl_hrg <= 100000, "Sedang" jika
<= 200000, selain itu "Mahal".tabel_tampil <- tabel_hrg
tabel_tampil$diskontotal <- paste0(round(tabel_tampil$diskontotal * 100), "%")
knitr::kable(tabel_tampil,
format.args = list(big.mark = ".", decimal.mark = ",", scientific = FALSE),
digits = 0,
caption = "Harga akhir transaksi 15 pelanggan")| no | nama | status | makanan | minuman | pajak | ttl_hrg | diskontotal | hrg_akhir |
|---|---|---|---|---|---|---|---|---|
| 1 | ali | member | 183.000 | 42.000 | 24.750 | 249.750 | 17% | 207.292 |
| 2 | budi | member | 48.000 | 12.000 | 6.600 | 66.600 | 2% | 65.268 |
| 3 | eka | member | 26.000 | 43.000 | 7.590 | 76.590 | 2% | 75.058 |
| 4 | dani | member | 90.000 | 42.000 | 14.520 | 146.520 | 7% | 136.264 |
| 5 | rahmat | member | 82.000 | 23.000 | 11.550 | 116.550 | 7% | 108.392 |
| 6 | muharram | member | 77.000 | 49.000 | 13.860 | 139.860 | 7% | 130.070 |
| 7 | rizki | member | 55.000 | 40.000 | 10.450 | 105.450 | 7% | 98.068 |
| 8 | rizal | member | 46.000 | 13.000 | 6.490 | 65.490 | 2% | 64.180 |
| 9 | eko | non-member | 193.000 | 30.000 | 24.530 | 247.530 | 15% | 210.400 |
| 10 | galang | non-member | 159.000 | 23.000 | 20.020 | 202.020 | 15% | 171.717 |
| 11 | bambang | non-member | 42.000 | 12.000 | 5.940 | 59.940 | 0% | 59.940 |
| 12 | dwi | non-member | 171.000 | 34.000 | 22.550 | 227.550 | 15% | 193.418 |
| 13 | tsabita | non-member | 128.000 | 9.000 | 15.070 | 152.070 | 10% | 136.863 |
| 14 | ikrima | non-member | 28.000 | 33.000 | 6.710 | 67.710 | 0% | 67.710 |
| 15 | rini | non-member | 27.000 | 14.000 | 4.510 | 45.510 | 0% | 45.510 |
total_sebelum_diskon <- sum(ttl_hrg)
total_diskon <- sum(ttl_hrg * diskontotal)
total_pendapatan <- sum(hrg_akhir)
ringkasan <- data.frame(
Keterangan = c("Total sebelum diskon (setelah pajak)",
"Total diskon diberikan",
"Total pendapatan akhir"),
Rupiah = c(total_sebelum_diskon, total_diskon, total_pendapatan)
)
knitr::kable(ringkasan,
format.args = list(big.mark = ".", decimal.mark = ",", scientific = FALSE),
digits = 0)| Keterangan | Rupiah |
|---|---|
| Total sebelum diskon (setelah pajak) | 1.969.140 |
| Total diskon diberikan | 198.990 |
| Total pendapatan akhir | 1.770.150 |
Kerjakan latihan terlebih dahulu sebelum melihat bagian ini.
Latihan 1
makanan_budi <- 48000
minuman_budi <- 12000
subtotal_budi <- makanan_budi + minuman_budi
pajak_budi <- subtotal_budi * 0.11
total_budi <- subtotal_budi + pajak_budi
c(subtotal = subtotal_budi, pajak = pajak_budi, total = total_budi)## subtotal pajak total
## 60000 6600 66600
Latihan 2
## [1] "galang"
## [1] 419000
## [1] 90333.33
Latihan 3
## [1] 252000 67200 77280 147840 117600 141120 106400 66080 249760 203840
## [11] 60480 229600 153440 68320 45920
## [1] 195140
Latihan 4
data$persen_makanan <- round(data$makanan / (data$makanan + data$minuman) * 100, 1)
head(data[, c("nama", "makanan", "minuman", "persen_makanan")], 5)Latihan 5
## [1] "eko" "galang" "dwi" "tsabita"
## [1] 8
Latihan 6
# 1. Rizki (nomor 7): member
total <- ttl_hrg[7]
if (total <= 100000) {
d_nom <- 0
} else if (total <= 150000) {
d_nom <- 0.05
} else if (total <= 200000) {
d_nom <- 0.10
} else {
d_nom <- 0.15
}
d_mem <- if (status[7] == "member") 0.02 else 0
d_total <- d_nom + d_mem
c(diskon_total = d_total, harga_akhir = total - total * d_total)## diskon_total harga_akhir
## 0.07 98068.50
# 2. Kategori
tabel_hrg$kategori <- ifelse(tabel_hrg$ttl_hrg <= 100000, "Hemat",
ifelse(tabel_hrg$ttl_hrg <= 200000, "Sedang", "Mahal"))
tabel_hrg[, c("nama", "ttl_hrg", "kategori")]Pada praktikum ini kita menyelesaikan satu kasus utuh, mulai dari variabel dan vektor, operasi aritmatika, data frame, hingga percabangan, untuk menghitung harga akhir transaksi restoran. Pola berpikirnya dapat dipakai ulang pada kasus lain, misalnya diskon toko, tarif ongkir, atau penentuan nilai mahasiswa.
Informasi sesi
## [1] "R version 4.6.1 (2026-06-24 ucrt)"