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