1 Pendahuluan

1.1 Tujuan Pembelajaran

Setelah menyelesaikan praktikum ini, mahasiswa mampu:

  1. Membuat dan memberi nama variabel serta mengenali tipe data dasar di R.
  2. Membuat dan mengolah vektor dengan fungsi c(), rep(), dan operator :.
  3. Melakukan operasi aritmatika pada vektor (operasi elemen per elemen).
  4. Menyusun data frame dan menambahkan kolom baru.
  5. Menggunakan operator perbandingan dan logika.
  6. Membuat percabangan dengan if, else if, else, ifelse(), dan ifelse() bertingkat (nested).
  7. Menyelesaikan kasus nyata: menghitung pajak, diskon, dan harga akhir transaksi.

1.2 Studi Kasus

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

  • Pajak restoran sebesar 11% dari subtotal (makanan + minuman).

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?

1.3 Alur Praktikum

Data mentah → Subtotal & pajak → Total harga → Diskon (percabangan) → Harga akhir


2 Materi 1: Variabel dan Tipe Data

2.1 Teori Singkat

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()

2.2 Contoh pada Kasus

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"
class(makanan_ali)
## [1] "numeric"
is.character(status_pelanggan)
## [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
pajak_ali
## [1] 24750
total_ali
## [1] 249750

Catatan: nama variabel di R bersifat case sensitive (Total berbeda dengan total), tidak boleh diawali angka, dan sebaiknya deskriptif.

2.3 Latihan 1

Buat variabel untuk pelanggan Budi (makanan Rp48.000, minuman Rp12.000, non-member), lalu hitung subtotal, pajak 11%, dan total harganya.

# Tulis jawaban Anda di sini

3 Materi 2: Vektor

3.1 Teori Singkat

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 b
  • rep(x, times) : mengulang nilai x sebanyak times kali

3.2 Membuat Data Pelanggan

no <- 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.

3.3 Mengakses Elemen Vektor

Elemen diakses dengan tanda kurung siku [ ] (indeks dimulai dari 1).

nama[3]          # pelanggan ke-3
## [1] "eka"
makanan[1:5]     # makanan pelanggan 1 sampai 5
## [1] 183000  48000  26000  90000  82000
nama[c(1, 9)]    # pelanggan ke-1 dan ke-9
## [1] "ali" "eko"
length(nama)     # banyak pelanggan
## [1] 15

3.4 Fungsi Ringkasan

sum(makanan)     # total penjualan makanan
## [1] 1355000
mean(minuman)    # rata-rata penjualan minuman
## [1] 27933.33
max(makanan)     # pembelian makanan terbesar
## [1] 193000
min(minuman)     # pembelian minuman terkecil
## [1] 9000

3.5 Latihan 2

  1. Tampilkan nama pelanggan ke-10.
  2. Berapa total penjualan minuman?
  3. Berapa rata-rata pembelian makanan?
# Tulis jawaban Anda di sini

4 Materi 3: Operasi Aritmatika pada Vektor

4.1 Teori Singkat

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

4.2 Menghitung Subtotal, Pajak, dan Total Harga

subtotal_harga <- makanan + minuman
pajak <- subtotal_harga * 0.11
ttl_hrg <- subtotal_harga + pajak

head(subtotal_harga)
## [1] 225000  60000  69000 132000 105000 126000
head(pajak)
## [1] 24750  6600  7590 14520 11550 13860
head(ttl_hrg)
## [1] 249750  66600  76590 146520 116550 139860

Pada baris pajak, nilai tunggal 0.11 otomatis “diulang” untuk seluruh elemen (recycling rule).

4.3 Latihan 3

  1. Ubah tarif pajak menjadi 12%, lalu hitung ulang total harga seluruh pelanggan (simpan di ttl_hrg_12).
  2. Hitung total pajak yang diterima restoran dari seluruh pelanggan (tarif 11%).
# Tulis jawaban Anda di sini

5 Materi 4: Data Frame

5.1 Teori Singkat

Data frame adalah tabel: setiap kolom adalah vektor (boleh berbeda tipe), setiap baris adalah satu pengamatan. Dibuat dengan data.frame().

data <- data.frame(no, nama, status, makanan, minuman, pajak, ttl_hrg)
data

5.2 Mengakses Data Frame

data$nama
##  [1] "ali"      "budi"     "eka"      "dani"     "rahmat"   "muharram"
##  [7] "rizki"    "rizal"    "eko"      "galang"   "bambang"  "dwi"     
## [13] "tsabita"  "ikrima"   "rini"
data[3, ]
data[1:5, c("nama", "ttl_hrg")]
nrow(data)
## [1] 15
ncol(data)
## [1] 7
str(data)
## '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 ...
summary(data$ttl_hrg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   45510   67155  116550  131276  177045  249750

5.3 Menambah Kolom Baru

data$subtotal <- data$makanan + data$minuman
head(data[, c("nama", "makanan", "minuman", "subtotal")])

5.4 Latihan 4

Tambahkan kolom persen_makanan yang berisi persentase pembelian makanan terhadap subtotal untuk setiap pelanggan. Tampilkan 5 baris pertama.

# Tulis jawaban Anda di sini

6 Materi 5: Operator Perbandingan dan Logika

6.1 Teori Singkat

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)

6.2 Contoh pada Kasus

status == "member"
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE
ttl_hrg > 100000
##  [1]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
## [13]  TRUE FALSE FALSE
# Member DAN total belanja di atas Rp150.000
status == "member" & ttl_hrg > 150000
##  [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE

Vektor logika dapat dipakai untuk menyaring data:

nama[ttl_hrg > 150000]
## [1] "ali"     "eko"     "galang"  "dwi"     "tsabita"
data[status == "member" & ttl_hrg > 150000, ]
sum(status == "member")
## [1] 8

6.3 Latihan 5

  1. Tampilkan nama pelanggan non-member yang total harganya lebih dari Rp100.000.
  2. Ada berapa pelanggan yang pembelian makanannya di atas Rp100.000 atau pembelian minumannya di atas Rp40.000?
# Tulis jawaban Anda di sini

7 Materi 6: Percabangan

Percabangan memungkinkan program memilih tindakan berdasarkan kondisi. Pada kasus ini, besar diskon bergantung pada status pelanggan dan total harga.

7.1 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
diskon_nominal + diskon_member
## [1] 0.17

Penting: if hanya menerima satu nilai TRUE/FALSE. Jika diberi vektor berisi banyak elemen, R akan memberi galat (error). Untuk vektor, gunakan ifelse().

7.2 ifelse() (untuk vektor)

Bentuk: ifelse(kondisi, nilai_jika_TRUE, nilai_jika_FALSE). Fungsi ini memeriksa setiap elemen vektor.

diskon <- rep(0, 15)
diskonmem <- ifelse(status == "member", diskon + 0.02, diskon)
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

7.3 ifelse() Bertingkat (Nested)

Untuk lebih dari dua kemungkinan, ifelse() dapat ditumpuk:

diskontotal <- ifelse(
  ttl_hrg <= 100000, diskonmem,
  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.

7.4 Menghitung Harga Akhir

hrg_akhir <- ttl_hrg - (ttl_hrg * diskontotal)

tabel_hrg <- data.frame(
  no, nama, status, makanan, minuman, pajak,
  ttl_hrg, diskontotal, hrg_akhir
)
tabel_hrg

7.5 Latihan 6

  1. Tentukan diskon total dan harga akhir untuk Rizki (nomor 7) secara manual dengan if/else if/else, lalu cocokkan dengan hasil di tabel_hrg.
  2. Buat kolom kategori pada tabel_hrg dengan ifelse() bertingkat: "Hemat" jika ttl_hrg <= 100000, "Sedang" jika <= 200000, selain itu "Mahal".
# Tulis jawaban Anda di sini

8 Rangkuman Kasus

8.1 Hasil Akhir Seluruh Pelanggan

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"
)
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

8.2 Ringkasan Pendapatan

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

8.3 Rata-rata Harga Akhir Berdasarkan Status

aggregate(hrg_akhir ~ status, data = tabel_hrg, FUN = mean)

9 Kunci Jawaban Latihan

Kerjakan latihan terlebih dahulu sebelum melihat bagian ini.

9.1 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

9.2 Latihan 2

nama[10]
## [1] "galang"
sum(minuman)
## [1] 419000
mean(makanan)
## [1] 90333.33

9.3 Latihan 3

ttl_hrg_12 <- (makanan + minuman) * 1.12
ttl_hrg_12
##  [1] 252000  67200  77280 147840 117600 141120 106400  66080 249760 203840
## [11]  60480 229600 153440  68320  45920
sum((makanan + minuman) * 0.11)  # Total pajak tarif 11%
## [1] 195140

9.4 Latihan 4

data$persen_makanan <- round(
  data$makanan / (data$makanan + data$minuman) * 100,
  1
)

head(data[, c("nama", "makanan", "minuman", "persen_makanan")], 5)

9.5 Latihan 5

nama[status == "non-member" & ttl_hrg > 100000]
## [1] "eko"     "galang"  "dwi"     "tsabita"
sum(makanan > 100000 | minuman > 40000)
## [1] 8

9.6 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
tabel_hrg[7, c("nama", "diskontotal", "hrg_akhir")]
# 2. Membuat 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")]

10 Penutup

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

sessionInfo()$R.version$version.string
## [1] "R version 4.6.1 (2026-06-24 ucrt)"