Exercise 1 — Convert temperatures

Fungsi convert_temperature(celsius, target = "Fahrenheit") mengonversi nilai suhu Celsius ke Fahrenheit atau Kelvin dengan rumus \(F = \frac{9}{5}C + 32\) dan \(K = C + 273.15\).

convert_temperature <- function(celsius, target = "Fahrenheit") {
  if (target == "Fahrenheit") {
    (9 / 5) * celsius + 32
  } else if (target == "Kelvin") {
    celsius + 273.15
  } else {
    stop("Target unit must be either 'Fahrenheit' or 'Kelvin'.")
  }
}

# Pengujian sesuai petunjuk:
convert_temperature(30)                    # 86
## [1] 86
convert_temperature(0, target = "Kelvin")  # 273.15
## [1] 273.15

Exercise 2 — Return score summaries in a list

Fungsi summarize_practice(x) menghitung jumlah amatan n, rata-rata average, median median, nilai minimum minimum, dan nilai maksimum maximum, lalu mengemasnya ke dalam objek list.

summarize_practice <- function(x) {
  list(
    n = length(x),
    average = mean(x),
    median = median(x),
    minimum = min(x),
    maximum = max(x)
  )
}

# Pengujian dengan data latihan:
practice_scores <- c(78, 82, 90, 74, 86)
res2 <- summarize_practice(practice_scores)

# Menampilkan hasil dan mengambil elemen average dengan operator $:
res2
## $n
## [1] 5
## 
## $average
## [1] 82
## 
## $median
## [1] 82
## 
## $minimum
## [1] 74
## 
## $maximum
## [1] 90
res2$average  # 82
## [1] 82

Exercise 3 — Standardize values

Fungsi standardize(x) menghitung skor baku (\(z\)-score) untuk setiap elemen: \(z_i = \frac{x_i - \bar{x}}{s}\), di mana \(s\) adalah simpangan baku sampel (sd(x)).

standardize <- function(x) {
  (x - mean(x)) / sd(x)
}

# Pengujian dengan data latihan:
practice_x <- c(55, 65, 70, 80, 90)
z_scores <- standardize(practice_x)
z_scores
## [1] -1.2583965 -0.5181632 -0.1480466  0.5921866  1.3324198
# Verifikasi properti skor baku (mean mendekati 0 dan sd mendekati 1):
mean(z_scores)  # ~ 1e-16 (dianggap 0 karena floating-point)
## [1] 0
sd(z_scores)    # 1
## [1] 1

Exercise 4 — Find the median by hand

Instruksi: Buat fungsi median_by_hand(x) tanpa memanggil median(). Urutkan data (sort()), lalu pisahkan penanganan ukuran sampel ganjil (odd) dan genap (even).

median_by_hand <- function(x) {
  # 1. Validasi input & bersihkan missing values
  if (!is.numeric(x)) stop("Input x harus bertipe numerik.")
  x <- x[!is.na(x)]
  
  n <- length(x)
  if (n == 0) return(NA_real_)
  
  # 2. Urutkan data secara ascending
  x_sorted <- sort(x)
  
  # 3. Pisahkan kasus ganjil dan genap
  if (n %% 2 == 1) {
    # Kasus ganjil: ambil elemen tepat di tengah
    med <- x_sorted[(n + 1) / 2]
  } else {
    # Kasus genap: rata-rata dua elemen di tengah
    mid1 <- x_sorted[n / 2]
    mid2 <- x_sorted[(n / 2) + 1]
    med <- (mid1 + mid2) / 2
  }
  
  return(med)
}

# --- Pengujian ---
practice_odd  <- c(9, 2, 7, 4, 6)
practice_even <- c(9, 2, 7, 4)

median_by_hand(practice_odd)   # Output: 6
## [1] 6
median_by_hand(practice_even)  # Output: 5.5
## [1] 5.5
# Verifikasi dengan fungsi bawaan R
all.equal(median_by_hand(practice_odd), median(practice_odd))   # TRUE
## [1] TRUE
all.equal(median_by_hand(practice_even), median(practice_even)) # TRUE
## [1] TRUE

Exercise 5 — Find two tied modes

Instruksi: Buat fungsi mode_by_hand(x) yang mengembalikan list berisi semua nilai modus (termasuk jika frekuensi tertinggi sama/seri) beserta frekuensi kemunculannya. Gunakan unique() dan sum(x == value)

mode_by_hand <- function(x) {
  # 1. Bersihkan missing values jika ada
  x <- x[!is.na(x)]
  if (length(x) == 0) {
    return(list(modes = NULL, frequency = 0))
  }
  
  # 2. Dapatkan nilai-nilai unik
  distinct_vals <- unique(x)
  
  # 3. Hitung frekuensi masing-masing nilai menggunakan sum(x == value)
  counts <- sapply(distinct_vals, function(val) sum(x == val))
  
  # 4. Cari frekuensi tertinggi
  max_freq <- max(counts)
  
  # 5. Ambil seluruh nilai yang memiliki frekuensi sama dengan max_freq
  modes <- distinct_vals[counts == max_freq]
  
  # 6. Kembalikan keluaran dalam format list
  list(
    modes = modes,
    frequency = max_freq
  )
}

# --- Pengujian ---
practice_modes <- c(1, 1, 3, 3, 3, 5, 5, 5, 8)
mode_by_hand(practice_modes)
## $modes
## [1] 3 5
## 
## $frequency
## [1] 3