Dosen Pengampu: Bayutama Isnaini, S.Si., M.Si.
Disusun oleh Kelompok G:
| No. | Nama | NIM |
|---|---|---|
| 1 | Imroatul Husna ImtiyazatI | 21108062610049 |
| 2 | Jeish Salim | 21108062610052 |
| 3 | Jihan Aprilia Setiawan | 21108062610053 |
| 4 | Lathifah Febriana Putri | 21108062610063 |
JURUSAN STATISTIKA UNIVERSITAS SEBELAS MARET FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM 2026
Kegiatan kampus seperti Pengenalan Kehidupan Kampus bagi Mahasiswa Baru (PKKMB), fun run, dan perayaan Dies Natalis melibatkan banyak peserta dengan kondisi kesehatan yang beragam. Dalam pelaksanaannya, posko kesehatan diperlukan sebagai tempat pemeriksaan awal bagi peserta yang mengalami keluhan atau membutuhkan bantuan kesehatan.
Proses pemeriksaan awal dapat melibatkan pencatatan data peserta serta pengukuran beberapa parameter, seperti berat badan, tinggi badan, suhu tubuh, tekanan darah sistolik, tekanan darah diastolik, dan denyut nadi. Apabila pencatatan dan pengelompokan dilakukan secara manual, petugas berpotensi mengalami kesulitan dalam mengolah data peserta dalam jumlah banyak secara cepat dan terstruktur.
Oleh karena itu, diperlukan suatu program sederhana yang dapat membantu mengolah data hasil pengukuran dan mengelompokkan peserta berdasarkan tingkat prioritas pemeriksaan awal. Program ini dirancang menggunakan bahasa pemrograman R dengan menerapkan konsep algoritma, pengolahan data numerik, validasi data, dan percabangan kondisi. Data peserta dapat dimasukkan melalui ketikan (untuk satu peserta) maupun dibaca dari berkas CSV atau Excel (untuk banyak peserta).
Sistem yang dikembangkan membagi peserta ke dalam tiga kategori simulasi, yaitu pita merah, pita kuning, dan pita hijau, ditambah satu status khusus “Perlu Diukur Ulang” untuk data yang kosong atau tidak wajar. Setiap kategori disertai rekomendasi tindak lanjut awal serta rekapitulasi jumlah peserta berdasarkan hasil klasifikasi. Sistem ini diharapkan dapat menjadi sarana pembelajaran penerapan algoritma dalam menyelesaikan permasalahan sederhana yang berkaitan dengan kegiatan kampus.
Sebuah kegiatan kampus menyelenggarakan posko kesehatan untuk melayani peserta yang membutuhkan pemeriksaan awal. Petugas memasukkan identitas peserta dan hasil pengukuran parameter kesehatan ke dalam program R, baik dengan mengetikkan data satu peserta maupun dengan memilih berkas yang berisi data banyak peserta.
Data yang dimasukkan meliputi ID peserta, nama, jenis kelamin, umur, berat badan, tinggi badan, suhu tubuh, tekanan darah sistolik, tekanan darah diastolik, dan denyut nadi. Data numerik terlebih dahulu diperiksa validitasnya, kemudian diproses menggunakan aturan klasifikasi yang telah ditetapkan dalam program.
Program menilai tiga parameter, yaitu suhu tubuh, tekanan darah, dan denyut nadi. Setiap parameter diberi skor 0 (normal) sampai dengan skor tertinggi sesuai tingkat penyimpangannya. Skor ketiga parameter dijumlahkan menjadi skor total, lalu diterjemahkan menjadi salah satu dari empat hasil berikut:
Kategori tertinggi (merah) ditetapkan apabila skor total mencapai 5 atau lebih, atau apabila tekanan darah masuk kategori krisis hipertensi (skor tekanan darah bernilai 3) walaupun parameter lain normal. Setelah seluruh data diproses, program menampilkan hasil klasifikasi setiap peserta. Untuk data banyak peserta, program juga membuat rekapitulasi jumlah dan persentase peserta pada setiap kategori serta menyimpannya ke berkas Excel.
Sistem ini merupakan simulasi pembelajaran algoritma, bukan alat diagnosis maupun sistem triase klinis yang tervalidasi.
Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah:
Praktikum ini bertujuan untuk:
if,
else if, else, case_when(), dan
if_else()) dalam proses klasifikasi.lapply() pada data frame.Manfaat yang diharapkan dari praktikum ini adalah:
Agar pembahasan lebih terarah, sistem memiliki batasan sebagai berikut.
Algoritma adalah urutan langkah yang logis, sistematis, dan terstruktur untuk menyelesaikan suatu permasalahan. Algoritma yang baik memiliki ciri: memiliki masukan, menghasilkan keluaran, setiap langkahnya jelas, jumlah langkahnya berhingga, dan berakhir pada suatu titik.
Dalam praktikum ini, algoritma digunakan untuk menerima data peserta, memeriksa validitas data, menghitung IMT, menentukan status setiap parameter, menjumlahkan skor, menentukan kategori prioritas simulasi, serta menampilkan hasil dan rekapitulasi. Algoritma dapat disajikan dalam bentuk uraian langkah (pseudocode).
R merupakan bahasa pemrograman yang dapat digunakan untuk pengolahan data, perhitungan statistik, dan visualisasi. Dalam praktikum ini, R digunakan untuk menerima input, memeriksa kondisi, menyimpan data dalam tabel, dan menghasilkan ringkasan hasil klasifikasi. RStudio digunakan sebagai lingkungan kerja (IDE) untuk menulis dan menjalankan kode.
Selain fungsi bawaan, program ini memakai tiga paket tambahan:
| Paket | Kegunaan dalam program |
|---|---|
dplyr |
Menyediakan if_else() dan case_when()
untuk pengelompokan berdasarkan kondisi |
readxl |
Membaca berkas Excel (read_excel()) |
openxlsx |
Menulis hasil ke berkas Excel dengan beberapa lembar
(write.xlsx()) |
Konsep Input–Process–Output (IPO) digunakan untuk menjelaskan alur kerja program.
Variabel merupakan nama yang digunakan untuk menyimpan data atau hasil pengolahan. Dalam R, variabel dapat menyimpan teks, angka, nilai logika, maupun struktur data seperti vektor, daftar (list), dan data frame.
| Tipe/struktur | Penjelasan | Contoh pada program |
|---|---|---|
character |
Teks | pilihan, alamat, kolom Nama,
Status_Suhu |
numeric |
Angka | kolom Umur, Suhu, IMT,
Skor_Total |
logical |
Nilai benar/salah (TRUE/FALSE) |
rentang_valid |
factor |
Data kategori dengan urutan level tetap | kolom Triase |
vector |
Kumpulan nilai bertipe sama | kolom_angka, kolom_wajib |
list |
Kumpulan nilai berbeda tipe | laporan, lembar |
data.frame |
Tabel berbaris dan berkolom | pasien, hasil_triase,
rekap |
NA |
Nilai hilang / tidak tersedia | skor total pada data yang perlu diukur ulang |
Operator merupakan simbol yang digunakan untuk melakukan perhitungan atau membandingkan nilai dalam program.
| Operator | Kegunaan |
|---|---|
<- |
Memberikan nilai ke variabel |
+, /, ^ |
Menjumlahkan skor, membagi, dan memangkatkan (rumus IMT) |
== |
Memeriksa kesamaan nilai |
>=, <=, <,
> |
Membandingkan nilai dengan batas tertentu |
& |
Menggabungkan syarat yang semuanya harus terpenuhi |
| |
Menggabungkan syarat yang cukup salah satunya terpenuhi |
! |
Membalik nilai logika (negasi), misalnya !all(...) |
%in% |
Memeriksa apakah nilai termasuk dalam suatu kumpulan |
$ |
Mengakses atau membuat kolom pada data frame |
~ |
Memisahkan kondisi dan hasil pada case_when() |
%>% |
Operator pipe dari paket dplyr; tidak wajib dan tidak
digunakan pada program ini |
Operator perbandingan dan logika digunakan untuk memeriksa apakah nilai parameter memenuhi kondisi klasifikasi yang ditetapkan dalam simulasi.
Percabangan adalah struktur pemrograman yang digunakan untuk mengambil keputusan berdasarkan kondisi tertentu. Program ini menggunakan tiga bentuk percabangan.
a. if, else if, dan
else untuk keputusan tunggal, yaitu memilih mode
input, memutuskan jenis berkas, dan memilih teks laporan untuk satu
peserta.
if (pilihan == "1") {
# mode satu pasien
} else if (pilihan == "2") {
# mode banyak pasien dari file
} else {
stop("Pilihan tidak valid. Jalankan ulang dan pilih 1 atau 2.")
}b. case_when() dari paket
dplyr untuk percabangan banyak kondisi yang bekerja pada
seluruh baris sekaligus. Kondisi diperiksa dari atas ke bawah dan hasil
dari kondisi pertama yang terpenuhi akan dipakai. Contohnya adalah
pengelompokan suhu menjadi Hipotermia, Normal, Demam, atau Demam
Tinggi.
c. if_else() dari paket
dplyr untuk percabangan dua arah pada seluruh baris, yaitu
menentukan status validasi data (Valid atau
Perlu Diukur Ulang).
Perulangan adalah struktur yang mengulang suatu proses untuk banyak
data. Pada R, perulangan eksplisit dapat ditulis dengan for
atau while. Namun, R juga mendukung
vektorisasi, yaitu operasi yang otomatis diterapkan
pada setiap elemen vektor atau setiap baris kolom data frame.
Program ini tidak menulis for atau while
secara eksplisit. Pemrosesan banyak peserta dilakukan melalui:
pasien$Berat / (pasien$Tinggi / 100)^2 yang menghitung IMT
untuk seluruh peserta sekaligus;lapply(), misalnya
lapply(pasien[kolom_angka], as.numeric) yang menerapkan
as.numeric() pada setiap kolom angka;case_when() dan if_else()
yang mengevaluasi kondisi untuk setiap baris.Dengan cara ini, satu perintah dapat memproses satu peserta maupun ratusan peserta tanpa perubahan kode.
Data frame adalah struktur data berbentuk tabel yang memiliki baris dan kolom. Dalam program ini, data frame digunakan untuk menyimpan identitas, hasil pengukuran, status setiap parameter, skor, kategori simulasi, dan rekomendasi tindak lanjut setiap peserta.
Rekapitulasi dilakukan dengan fungsi table() untuk
menghitung jumlah peserta pada setiap kategori, kemudian dihitung
persentasenya terhadap seluruh peserta. Karena kolom Triase
bertipe factor dengan level tetap (Merah, Kuning, Hijau,
Perlu Diukur Ulang), seluruh kategori selalu muncul pada rekap, termasuk
kategori yang jumlahnya nol.
Triase adalah proses memilah pasien berdasarkan tingkat kegawatan agar penanganan diberikan sesuai prioritas. Pada banyak sistem, prioritas dilambangkan dengan warna, misalnya merah (segera), kuning (menunggu/dipantau), dan hijau (ringan). Modul ini hanya meniru gagasan tersebut dalam bentuk simulasi sederhana.
Parameter yang digunakan pada program adalah sebagai berikut.
| Parameter | Satuan | Penjelasan singkat |
|---|---|---|
| Suhu tubuh | °C | Ukuran panas tubuh; nilai terlalu tinggi menandakan demam, nilai terlalu rendah menandakan hipotermia |
| Tekanan darah sistolik | mmHg | Tekanan pada pembuluh darah saat jantung berkontraksi |
| Tekanan darah diastolik | mmHg | Tekanan pada pembuluh darah saat jantung berelaksasi |
| Denyut nadi | kali/menit | Jumlah denyut jantung per menit; terlalu lambat disebut bradikardia, terlalu cepat disebut takikardia |
| Indeks Massa Tubuh (IMT) | kg/m² | Berat badan (kg) dibagi kuadrat tinggi badan (m); dipakai untuk status gizi, bukan untuk skor prioritas |
Batas nilai pada modul ini adalah aturan sederhana untuk keperluan demonstrasi pemrograman. Batas tersebut tidak divalidasi untuk penggunaan klinis dan tidak boleh dipakai sebagai dasar keputusan medis.
Sistem Klasifikasi Prioritas Kesehatan Peserta Kegiatan Kampus Berbasis R.
Sistem dirancang untuk menerima data peserta, memeriksa kelengkapan dan kewajaran data, menentukan kategori prioritas simulasi berdasarkan aturan skor yang telah ditetapkan, dan menampilkan hasilnya dalam bentuk tabel.
Pengguna menjalankan program melalui RStudio. Setelah program berjalan, pengguna memilih salah satu dari dua mode:
| Mode | Sumber data | Jumlah peserta | Keluaran |
|---|---|---|---|
| 1 | Diketik melalui console | Satu peserta | Tabel hasil dan laporan singkat peserta di console |
| 2 | Berkas CSV atau Excel yang dipilih melalui jendela pemilihan berkas | Banyak peserta | Tabel hasil di console serta berkas hasil_triase.xlsx
(lembar Hasil_Triase dan Rekap_Triase) |
Program kemudian memproses data menggunakan percabangan dan sistem skor, lalu menyimpan hasilnya ke dalam data frame. Pada akhir proses, program menampilkan hasil klasifikasi serta, untuk mode 2, jumlah dan persentase peserta pada setiap kategori.
Data masukan yang digunakan dalam sistem ini meliputi identitas peserta dan parameter kesehatan yang akan diperiksa. Pada mode 1 data diketik melalui console RStudio, sedangkan pada mode 2 data dibaca dari berkas. Rincian data adalah sebagai berikut.
| No. | Nama kolom | Keterangan | Tipe | Satuan/isi |
|---|---|---|---|---|
| 1 | ID |
ID peserta | teks | bebas |
| 2 | Nama |
Nama peserta | teks | bebas |
| 3 | Jenis_Kelamin |
Jenis kelamin | teks | L atau P |
| 4 | Umur |
Usia peserta | angka | tahun |
| 5 | Berat |
Berat badan | angka | kg |
| 6 | Tinggi |
Tinggi badan | angka | cm |
| 7 | Suhu |
Suhu tubuh | angka | °C |
| 8 | Sistolik |
Tekanan darah sistolik | angka | mmHg |
| 9 | Diastolik |
Tekanan darah diastolik | angka | mmHg |
| 10 | Nadi |
Denyut nadi | angka | kali/menit |
Untuk mode 2, berkas CSV atau Excel harus memiliki sepuluh kolom di atas dengan penulisan nama yang sama persis (huruf besar-kecil dibedakan). Kolom tambahan diabaikan, sedangkan jika ada kolom wajib yang hilang program berhenti dengan pesan kesalahan.
Data parameter kesehatan tersebut digunakan sebagai dasar penentuan kategori prioritas simulasi, yaitu merah, kuning, atau hijau.
Sebelum diklasifikasikan, setiap baris data diperiksa dengan aturan berikut. Baris dinyatakan Valid hanya jika seluruh aturan terpenuhi; jika ada satu saja yang tidak terpenuhi (termasuk nilai kosong atau bukan angka), statusnya menjadi Perlu Diukur Ulang.
| Variabel | Aturan nilai valid |
|---|---|
Umur |
15 sampai 80 tahun |
Berat |
30 sampai 200 kg |
Tinggi |
120 sampai 220 cm |
Suhu |
30 sampai 43 °C |
Sistolik |
60 sampai 260 mmHg |
Diastolik |
30 sampai 160 mmHg |
Sistolik dan Diastolik |
Diastolik harus lebih kecil daripada
Sistolik |
Nadi |
30 sampai 220 kali/menit |
Jenis_Kelamin |
Hanya "L" atau "P" (huruf kapital) |
Nilai yang bukan angka pada kolom numerik diubah menjadi
NA oleh as.numeric(), sehingga otomatis
dinyatakan perlu diukur ulang. Validasi ini hanya memeriksa kewajaran
rentang, bukan ketepatan cara pengukuran.
Sistem menentukan status setiap parameter, mengubahnya menjadi skor, menjumlahkan skor, dan menetapkan kategori prioritas.
a. Status suhu tubuh
| Kondisi suhu (°C) | Status | Skor |
|---|---|---|
| Kurang dari 35 | Hipotermia | 2 |
| 35 sampai kurang dari 37,5 | Normal | 0 |
| 37,5 sampai kurang dari 39 | Demam | 1 |
| 39 atau lebih | Demam Tinggi | 2 |
b. Status tekanan darah (kondisi diperiksa dari atas ke bawah; kondisi pertama yang terpenuhi dipakai)
| Urutan | Kondisi (mmHg) | Status | Skor |
|---|---|---|---|
| 1 | Sistolik ≥ 180 atau diastolik ≥ 120 | Krisis Hipertensi | 3 |
| 2 | Sistolik ≥ 140 atau diastolik ≥ 90 | Hipertensi | 2 |
| 3 | Sistolik ≥ 120 atau diastolik ≥ 80 | Meningkat | 1 |
| 4 | Sistolik < 90 atau diastolik < 60 | Rendah | 1 |
| 5 | Selain kondisi di atas | Normal | 0 |
c. Status denyut nadi
| Kondisi nadi (kali/menit) | Status | Skor |
|---|---|---|
| Kurang dari 60 | Bradikardia | 1 |
| 60 sampai 100 | Normal | 0 |
| Lebih dari 100 sampai kurang dari 140 | Takikardia | 1 |
| 140 atau lebih | Takikardia Berat | 2 |
d. Status gizi berdasarkan IMT (tidak masuk skor prioritas)
IMT dihitung dengan rumus:
\[\text{IMT} = \frac{\text{Berat (kg)}}{\left(\frac{\text{Tinggi (cm)}}{100}\right)^2}\]
dan dibulatkan satu angka di belakang koma.
| Kondisi IMT | Status gizi |
|---|---|
| Kurang dari 18,5 | Kurus |
| 18,5 sampai 25,0 | Normal |
| Lebih dari 25,0 sampai 27,0 | Gemuk |
| Lebih dari 27,0 | Obesitas |
e. Skor total dan kategori prioritas
Skor_Total = skor suhu + skor tekanan darah + skor nadi (nilai 0 sampai 7)
| Urutan | Kondisi | Kategori | Tindakan awal yang disarankan |
|---|---|---|---|
| 1 | Status_Data = Perlu Diukur Ulang (skor total diisi
NA) |
Perlu Diukur Ulang | Ukur ulang parameter yang kosong atau tidak wajar |
| 2 | Skor total ≥ 5 atau skor tekanan darah = 3 | Merah | Segera panggil tenaga medis dan siapkan rujukan |
| 3 | Skor total ≥ 2 (dan < 5) | Kuning | Observasi di posko dan ukur ulang dalam 15 menit |
| 4 | Selain itu (skor total 0 atau 1) | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
Status_Data.dplyr, readxl, dan
openxlsx; tetapkan daftar kolom angka dan kolom wajib.Status_Data = “Valid”; selain itu “Perlu Diukur
Ulang”.Skor_Total = skor suhu + skor tekanan darah +
skor nadi. Jika data “Perlu Diukur Ulang”, isi Skor_Total
dengan NA.Triase:
Skor_Total ≥ 5 atau skor tekanan darah = 3:
“Merah”Skor_Total ≥ 2: “Kuning”Tindakan sesuai kategori triase.hasil_triase.xlsx di folder yang sama dengan berkas
input.Laptop, digunakan untuk menjalankan dan menyusun program.
R dan RStudio, digunakan untuk menulis, menjalankan, dan menguji program menggunakan bahasa R.
Paket R: dplyr,
readxl, dan openxlsx. Jika belum terpasang,
jalankan perintah berikut satu kali pada console:
Microsoft Excel (atau aplikasi spreadsheet lain), digunakan untuk menyiapkan berkas input dan melihat berkas hasil.
Program memanfaatkan beberapa fungsi bawaan R dan fungsi dari paket tambahan.
| Fungsi | Asal | Kegunaan |
|---|---|---|
library() |
bawaan | Memanggil paket |
c() |
bawaan | Membuat vektor |
cat() |
bawaan | Menampilkan teks atau informasi pada konsol |
readline() |
bawaan | Menerima masukan teks dari pengguna |
data.frame() |
bawaan | Membuat tabel data |
as.numeric() |
bawaan | Mengubah nilai menjadi tipe numerik |
file.choose() |
bawaan | Membuka jendela pemilihan berkas |
endsWith() |
bawaan | Memeriksa akhiran teks (ekstensi berkas) |
tolower() |
bawaan | Mengubah teks menjadi huruf kecil |
read.csv() |
bawaan | Membaca data dari berkas CSV |
as.data.frame() |
bawaan | Mengubah objek menjadi data frame |
names() |
bawaan | Mengambil nama kolom |
all() |
bawaan | Memeriksa apakah semua nilai logika bernilai benar |
stop() |
bawaan | Menghentikan program dengan pesan kesalahan |
paste() |
bawaan | Menggabungkan teks |
ifelse() |
bawaan | Memilih teks berdasarkan kondisi (untuk tampilan mode) |
lapply() |
bawaan | Menerapkan fungsi pada setiap kolom |
is.na() |
bawaan | Memeriksa nilai hilang |
round() |
bawaan | Membulatkan hasil perhitungan IMT dan persentase |
factor() |
bawaan | Membuat data kategori dengan level berurutan |
nrow() |
bawaan | Menghitung jumlah baris |
print() |
bawaan | Menampilkan tabel hasil pengolahan |
list() |
bawaan | Membuat daftar (laporan dan lembar Excel) |
as.character() |
bawaan | Mengubah nilai menjadi teks |
table() |
bawaan | Menghitung frekuensi tiap kategori |
as.vector() |
bawaan | Mengubah tabel frekuensi menjadi vektor |
file.path() |
bawaan | Membentuk alamat atau lokasi berkas keluaran |
dirname() |
bawaan | Mengambil lokasi folder dari suatu alamat berkas |
read_excel() |
readxl |
Membaca data dari berkas Excel |
if_else() |
dplyr |
Menentukan hasil berdasarkan kondisi logika |
case_when() |
dplyr |
Mengelompokkan nilai ke dalam beberapa kategori |
write.xlsx() |
openxlsx |
Menyimpan data ke dalam berkas Excel |
Implementasi program dilakukan melalui beberapa tahapan berikut.
Kode lengkap tersedia pada Lampiran A. Bagian ini menjelaskan kode per blok.
a. Persiapan paket dan konstanta
library(dplyr)
library(readxl)
library(openxlsx)
kolom_angka <- c("Umur", "Berat", "Tinggi", "Suhu", "Sistolik", "Diastolik", "Nadi")
kolom_wajib <- c("ID", "Nama", "Jenis_Kelamin", kolom_angka)Tiga paket dipanggil. kolom_angka menyimpan nama kolom
yang harus bertipe angka, sedangkan kolom_wajib menyimpan
seluruh kolom yang harus ada pada data.
b. Pemilihan mode
cat(" POSKO KESEHATAN KAMPUS ")
pilihan <- readline("Pilih mode (1 = satu pasien lewat ketikan, 2 = banyak pasien dari file): ")Program menampilkan judul dan menyimpan pilihan pengguna sebagai teks
pada variabel pilihan.
c. Mode 1: satu pasien lewat ketikan
if (pilihan == "1") {
pasien <- data.frame(
ID = readline("ID pasien: "),
Nama = readline("Nama pasien: "),
Jenis_Kelamin = readline("Jenis kelamin (L/P): "),
Umur = as.numeric(readline("Umur (tahun): ")),
...
Nadi = as.numeric(readline("Denyut nadi (kali/menit): "))
)
}Setiap readline() menanyakan satu data. Data angka
dibungkus as.numeric() agar bertipe angka, lalu seluruhnya
disusun menjadi data frame pasien dengan satu baris.
d. Mode 2: banyak pasien dari berkas
} else if (pilihan == "2") {
alamat <- file.choose()
if (endsWith(tolower(alamat), ".csv")) {
pasien <- read.csv(alamat)
} else {
pasien <- as.data.frame(read_excel(alamat))
}
if (!all(kolom_wajib %in% names(pasien))) {
stop("Kolom file tidak lengkap. Kolom wajib: ", paste(kolom_wajib, collapse = ", "))
}
} else {
stop("Pilihan tidak valid. Jalankan ulang dan pilih 1 atau 2.")
}file.choose() membuka jendela pemilihan berkas. Jika
ekstensi berkas .csv (huruf besar/kecil tidak dibedakan
karena tolower()), berkas dibaca dengan
read.csv(); selain itu dianggap berkas Excel dan dibaca
dengan read_excel(). Selanjutnya %in% dan
all() memeriksa apakah seluruh kolom wajib tersedia; jika
tidak, stop() menghentikan program. Pilihan selain 1 dan 2
juga menghentikan program.
e. Konversi tipe data
cat("Mode:", ifelse(pilihan == "1", "satu pasien (ketikan)", "banyak pasien (file)"), "\n")
pasien[kolom_angka] <- lapply(pasien[kolom_angka], as.numeric)Program menampilkan mode yang dipilih, lalu memastikan semua kolom
angka bertipe numerik. Teks yang bukan angka berubah menjadi
NA.
f. Validasi rentang nilai
rentang_valid <- pasien$Umur >= 15 & pasien$Umur <= 80 &
pasien$Berat >= 30 & pasien$Berat <= 200 &
...
pasien$Diastolik < pasien$Sistolik &
pasien$Nadi >= 30 & pasien$Nadi <= 220 &
pasien$Jenis_Kelamin %in% c("L", "P")
pasien$Status_Data <- if_else(rentang_valid, "Valid", "Perlu Diukur Ulang", missing = "Perlu Diukur Ulang")Seluruh syarat digabung dengan & sehingga
rentang_valid bernilai TRUE hanya jika
semuanya terpenuhi. Argumen missing = ... pada
if_else() memastikan baris yang mengandung NA
juga dinyatakan “Perlu Diukur Ulang”.
g. IMT dan status gizi
pasien$IMT <- round(pasien$Berat / (pasien$Tinggi / 100)^2, 1)
pasien$Status_Gizi <- case_when(
is.na(pasien$IMT) ~ NA_character_,pasien$IMT < 18.5 ~ "Kurus",
pasien$IMT <= 25 ~ "Normal",
pasien$IMT <= 27 ~ "Gemuk",
TRUE ~ "Obesitas"
)IMT dihitung untuk semua peserta. case_when() memeriksa
kondisi dari atas ke bawah; TRUE ~ "Obesitas" menangkap
semua nilai yang tersisa (> 27).
h. Status suhu, tekanan darah, dan nadi
pasien$Status_Suhu <- case_when(
is.na(pasien$Suhu) ~ NA_character_,
pasien$Suhu < 35 ~ "Hipotermia",
pasien$Suhu < 37.5 ~ "Normal",
pasien$Suhu < 39 ~ "Demam",
TRUE ~ "Demam Tinggi"
)Status tekanan darah (Status_TD) dan nadi
(Status_Nadi) dibuat dengan pola yang sama. Pada
Status_TD, urutan kondisi sangat penting: Krisis Hipertensi
diperiksa lebih dulu, kemudian Hipertensi, Meningkat, Rendah, dan
terakhir Normal.
i. Skor setiap parameter
skor_suhu <- case_when(
pasien$Status_Suhu == "Normal" ~ 0,
pasien$Status_Suhu == "Demam" ~ 1,
TRUE ~ 2
)
skor_td <- case_when(
pasien$Status_TD == "Normal" ~ 0,
pasien$Status_TD %in% c("Meningkat", "Rendah") ~ 1,
pasien$Status_TD == "Hipertensi" ~ 2,
TRUE ~ 3
)
skor_nadi <- case_when(
pasien$Status_Nadi == "Normal" ~ 0,
pasien$Status_Nadi %in% c("Bradikardia", "Takikardia") ~ 1,
TRUE ~ 2
)Status teks diubah menjadi skor angka sesuai tabel pada 3.5.
j. Skor total, triase, dan tindakan
pasien$Skor_Total <- skor_suhu + skor_td + skor_nadi
pasien$Skor_Total[pasien$Status_Data == "Perlu Diukur Ulang"] <- NA
pasien$Triase <- case_when(
pasien$Status_Data == "Perlu Diukur Ulang" ~ "Perlu Diukur Ulang",
pasien$Skor_Total >= 5 | skor_td == 3 ~ "Merah",
pasien$Skor_Total >= 2 ~ "Kuning",
TRUE ~ "Hijau"
)
pasien$Triase <- factor(pasien$Triase, levels = c("Merah", "Kuning", "Hijau", "Perlu Diukur Ulang"))Skor total dijumlahkan, lalu dikosongkan (NA) untuk data
yang perlu diukur ulang. case_when() menentukan triase
dengan urutan prioritas: data tidak valid, merah, kuning, hijau. Kolom
Triase diubah menjadi factor agar urutan
kategori tetap. Kolom Tindakan kemudian diisi dengan
case_when() berdasarkan nilai Triase.
k. Menampilkan dan menyimpan hasil
cat("\n===== HASIL TRIASE =====\n")
print(pasien[, c("ID", "Nama", "IMT", "Status_Gizi", "Status_Suhu", "Status_TD", "Status_Nadi", "Skor_Total", "Triase")], row.names = FALSE)Tabel ringkas hasil triase selalu ditampilkan di console. Setelah
itu, if (nrow(pasien) == 1) memisahkan dua kondisi:
list bernama laporan, lalu percabangan
if/else if/else mencetak status
prioritas tinggi (merah), sedang (kuning), rendah (hijau), atau pesan
bahwa data belum valid, diikuti tindakan awal.hasil_triase (kolom yang akan diekspor), rekap
(jumlah dan persen per kategori memakai table()), kemudian
keduanya dimasukkan ke list bernama lembar dan
ditulis ke berkas hasil_triase.xlsx di folder berkas input
melalui write.xlsx(). Nama elemen list menjadi
nama lembar Excel, yaitu Hasil_Triase dan
Rekap_Triase.Ctrl+Shift+S). Disarankan
tidak menjalankan skrip dengan memblok seluruh baris lalu menekan
Ctrl+Enter, karena perintah readline() dapat
ikut membaca baris skrip berikutnya sebagai jawaban.1 atau 2 pada console, lalu tekan
Enter.37.5).hasil_triase.xlsx otomatis dibuat di folder yang sama
dengan berkas input, dan lokasinya dicetak pada baris “Selesai. Hasil
disimpan di: …”.hasil_triase.xlsx sedang terbuka di Excel,
tutup terlebih dahulu sebelum menjalankan ulang agar berkas dapat
ditimpa.Hasil implementasi dijelaskan menggunakan data peserta pada berkas
data_CM.xlsx. Contoh berikut menunjukkan bentuk keluaran
program.
a. Contoh keluaran mode 1 (satu peserta: P006 Sri Wahyuni)
Mode: satu pasien (ketikan)
===== HASIL TRIASE =====
ID Nama IMT Status_Gizi Status_Suhu Status_TD Status_Nadi Skor_Total Triase
P006 Sri Wahyuni 23.2 Normal Normal Meningkat Normal 1 Hijau
Pasien : Sri Wahyuni
Status : PRIORITAS RENDAH (HIJAU), skor 1
Tindakan: Istirahat, minum cukup, boleh beraktivitas kembali
b. Contoh keluaran mode 2 (banyak peserta)
Data contoh untuk mode 2 diambil dari berkas
data_CM.xlsx yang berisi 20 peserta dengan sepuluh kolom.
Karena program membaca nama kolom secara persis, nama kolom pada berkas
disesuaikan terlebih dahulu dengan nama kolom wajib sebagai berikut.
Nama kolom pada data_CM.xlsx |
Nama kolom yang dibutuhkan program |
|---|---|
Id |
ID |
Nama |
Nama |
Jenis Kelamin |
Jenis_Kelamin |
Umur |
Umur |
Berat Badan (Kg) |
Berat |
Tinggi Badan(cm) |
Tinggi |
Suhu Tubuh |
Suhu |
Sistolik |
Sistolik |
Diastolik |
Diastolik |
Denyut Nadi |
Nadi |
Setelah berkas dipilih, program mencetak tabel hasil triase di
console dan menyimpan berkas hasil_triase.xlsx di folder
yang sama dengan berkas input. Isi lembar Hasil_Triase
adalah sebagai berikut.
| ID | Nama | Jenis_Kelamin | Umur | IMT | Status_Gizi | Status_Suhu | Status_TD | Status_Nadi | Status_Data | Skor_Total | Triase | Tindakan |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| P001 | Budi Santoso | L | 17 | 21.6 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P002 | Siti Aminah | P | 18 | 22.4 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P003 | Agus Prasetyo | L | 20 | 20.8 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P004 | Dewi Lestari | P | 19 | 22.8 | Normal | Normal | Meningkat | Normal | Valid | 1 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P005 | Slamet Riyadi | L | 22 | 22.7 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P006 | Sri Wahyuni | P | 16 | 23.2 | Normal | Normal | Meningkat | Normal | Valid | 1 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P007 | Joko Widodo | L | 18 | 20.8 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P008 | Rina Marlina | P | 18 | 22.6 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P009 | Bima Hartono | L | 23 | 21.7 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P010 | Ani Rahayu | P | 17 | 23.3 | Normal | Normal | Meningkat | Normal | Valid | 1 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P011 | Eko Nugroho | L | 18 | 21.4 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P012 | Yuni Astuti | P | 20 | 22.3 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P013 | Hendra Saputra | L | 17 | 20.9 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P014 | Lia Permata | P | 19 | 22.8 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P015 | Tono Suharto | L | 17 | 21.8 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P016 | Maya Sari | P | 20 | 23.2 | Normal | Normal | Meningkat | Normal | Valid | 1 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P017 | Rudi Hermawan | L | 21 | 20.9 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P018 | Fitri Handayani | P | 20 | 22.5 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P019 | Wawan Setia | L | 22 | 21.6 | Normal | Normal | Normal | Normal | Valid | 0 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
| P020 | Nur Hidayah | P | 19 | 22.7 | Normal | Normal | Meningkat | Normal | Valid | 1 | Hijau | Istirahat, minum cukup, boleh beraktivitas kembali |
Isi lembar Rekap_Triase:
| Triase | Jumlah | Persen |
|---|---|---|
| Merah | 0 | 0.0 |
| Kuning | 0 | 0.0 |
| Hijau | 20 | 100.0 |
| Perlu Diukur Ulang | 0 | 0.0 |
Seluruh 20 peserta berstatus Valid dan berkategori Hijau. Peserta P004, P006, P010, P016, P020 memiliki status tekanan darah Meningkat (skor 1), tetapi skor totalnya tetap kurang dari 2 sehingga tidak masuk kategori Kuning.
Program memiliki beberapa keterbatasan sebagai berikut.
L/P huruf kapital (dianggap tidak valid).readline() dan
file.choose() sehingga hanya dapat dijalankan secara
interaktif (misalnya di RStudio), bukan sebagai skrip otomatis tanpa
interaksi.Sistem Klasifikasi Prioritas Kesehatan Peserta Kegiatan Kampus Berbasis R merupakan contoh penerapan algoritma untuk mengolah data numerik dan mengelompokkan hasil pengukuran peserta ke dalam kategori simulasi merah, kuning, dan hijau, serta status “Perlu Diukur Ulang” untuk data yang tidak wajar.
Melalui program ini, mahasiswa dapat mempraktikkan konsep input,
proses, output, variabel, operator logika, percabangan (if,
else if, else, case_when(), dan
if_else()), pemrosesan banyak data dengan operasi vektor
dan lapply(), pembacaan berkas CSV dan Excel, validasi
data, penyimpanan data, dan rekapitulasi. Program juga menunjukkan
bagaimana pemrograman dapat membantu menyusun informasi secara lebih
sistematis.
Meskipun demikian, sistem ini memiliki batasan karena aturan klasifikasi masih berupa simulasi sederhana. Oleh sebab itu, hasil program tidak dapat digunakan sebagai diagnosis atau keputusan triase medis tanpa validasi dan pengawasan tenaga kesehatan.
Pengembangan selanjutnya dapat mencakup:
Apabila akan diterapkan dalam kegiatan nyata, aturan prioritas harus ditentukan dan disetujui oleh tenaga kesehatan yang berwenang.
library(dplyr)
library(readxl)
library(openxlsx)
kolom_angka <- c("Umur", "Berat", "Tinggi", "Suhu", "Sistolik", "Diastolik", "Nadi")
kolom_wajib <- c("ID", "Nama", "Jenis_Kelamin", kolom_angka)
cat(" POSKO KESEHATAN KAMPUS ")
pilihan <- readline("Pilih mode (1 = satu pasien lewat ketikan, 2 = banyak pasien dari file): ")
if (pilihan == "1") {
pasien <- data.frame(
ID = readline("ID pasien: "),
Nama = readline("Nama pasien: "),
Jenis_Kelamin = readline("Jenis kelamin (L/P): "),
Umur = as.numeric(readline("Umur (tahun): ")),
Berat = as.numeric(readline("Berat badan (kg): ")),
Tinggi = as.numeric(readline("Tinggi badan (cm): ")),
Suhu = as.numeric(readline("Suhu tubuh (derajat Celsius): ")),
Sistolik = as.numeric(readline("Tekanan darah sistolik (mmHg): ")),
Diastolik = as.numeric(readline("Tekanan darah diastolik (mmHg): ")),
Nadi = as.numeric(readline("Denyut nadi (kali/menit): "))
)
} else if (pilihan == "2") {
alamat <- file.choose()
if (endsWith(tolower(alamat), ".csv")) {
pasien <- read.csv(alamat)
} else {
pasien <- as.data.frame(read_excel(alamat))
}
if (!all(kolom_wajib %in% names(pasien))) {
stop("Kolom file tidak lengkap. Kolom wajib: ", paste(kolom_wajib, collapse = ", "))
}
} else {
stop("Pilihan tidak valid. Jalankan ulang dan pilih 1 atau 2.")
}
cat("Mode:", ifelse(pilihan == "1", "satu pasien (ketikan)", "banyak pasien (file)"), "\n")
pasien[kolom_angka] <- lapply(pasien[kolom_angka], as.numeric)
rentang_valid <- pasien$Umur >= 15 & pasien$Umur <= 80 &
pasien$Berat >= 30 & pasien$Berat <= 200 &
pasien$Tinggi >= 120 & pasien$Tinggi <= 220 &
pasien$Suhu >= 30 & pasien$Suhu <= 43 &
pasien$Sistolik >= 60 & pasien$Sistolik <= 260 &
pasien$Diastolik >= 30 & pasien$Diastolik <= 160 &
pasien$Diastolik < pasien$Sistolik &
pasien$Nadi >= 30 & pasien$Nadi <= 220 &
pasien$Jenis_Kelamin %in% c("L", "P")
pasien$Status_Data <- if_else(rentang_valid, "Valid", "Perlu Diukur Ulang", missing = "Perlu Diukur Ulang")
pasien$IMT <- round(pasien$Berat / (pasien$Tinggi / 100)^2, 1)
pasien$Status_Gizi <- case_when(
is.na(pasien$IMT) ~ NA_character_,pasien$IMT < 18.5 ~ "Kurus",
pasien$IMT <= 25 ~ "Normal",
pasien$IMT <= 27 ~ "Gemuk",
TRUE ~ "Obesitas"
)
pasien$Status_Suhu <- case_when(
is.na(pasien$Suhu) ~ NA_character_,
pasien$Suhu < 35 ~ "Hipotermia",
pasien$Suhu < 37.5 ~ "Normal",
pasien$Suhu < 39 ~ "Demam",
TRUE ~ "Demam Tinggi"
)
pasien$Status_TD <- case_when(
is.na(pasien$Sistolik) | is.na(pasien$Diastolik) ~ NA_character_,
pasien$Sistolik >= 180 | pasien$Diastolik >= 120 ~ "Krisis Hipertensi",
pasien$Sistolik >= 140 | pasien$Diastolik >= 90 ~ "Hipertensi",
pasien$Sistolik >= 120 | pasien$Diastolik >= 80 ~ "Meningkat",
pasien$Sistolik < 90 | pasien$Diastolik < 60 ~ "Rendah",
TRUE ~ "Normal"
)
pasien$Status_Nadi <- case_when(
is.na(pasien$Nadi) ~ NA_character_,
pasien$Nadi < 60 ~ "Bradikardia",
pasien$Nadi <= 100 ~ "Normal",
pasien$Nadi < 140 ~ "Takikardia",
TRUE ~ "Takikardia Berat"
)
skor_suhu <- case_when(
pasien$Status_Suhu == "Normal" ~ 0,
pasien$Status_Suhu == "Demam" ~ 1,
TRUE ~ 2
)
skor_td <- case_when(
pasien$Status_TD == "Normal" ~ 0,
pasien$Status_TD %in% c("Meningkat", "Rendah") ~ 1,
pasien$Status_TD == "Hipertensi" ~ 2,
TRUE ~ 3
)
skor_nadi <- case_when(
pasien$Status_Nadi == "Normal" ~ 0,
pasien$Status_Nadi %in% c("Bradikardia", "Takikardia") ~ 1,
TRUE ~ 2
)
pasien$Skor_Total <- skor_suhu + skor_td + skor_nadi
pasien$Skor_Total[pasien$Status_Data == "Perlu Diukur Ulang"] <- NA
pasien$Triase <- case_when(
pasien$Status_Data == "Perlu Diukur Ulang" ~ "Perlu Diukur Ulang",
pasien$Skor_Total >= 5 | skor_td == 3 ~ "Merah",
pasien$Skor_Total >= 2 ~ "Kuning",
TRUE ~ "Hijau"
)
pasien$Triase <- factor(pasien$Triase, levels = c("Merah", "Kuning", "Hijau", "Perlu Diukur Ulang"))
pasien$Tindakan <- case_when(
pasien$Triase == "Merah" ~ "Segera panggil tenaga medis dan siapkan rujukan",
pasien$Triase == "Kuning" ~ "Observasi di posko dan ukur ulang dalam 15 menit",
pasien$Triase == "Hijau" ~ "Istirahat, minum cukup, boleh beraktivitas kembali",
TRUE ~ "Ukur ulang parameter yang kosong atau tidak wajar"
)
cat("\n===== HASIL TRIASE =====\n")
print(pasien[, c("ID", "Nama", "IMT", "Status_Gizi", "Status_Suhu", "Status_TD", "Status_Nadi", "Skor_Total", "Triase")], row.names = FALSE)
if (nrow(pasien) == 1) {
laporan <- list(
Nama = pasien$Nama,
Triase = as.character(pasien$Triase),
Skor = pasien$Skor_Total,
Tindakan = pasien$Tindakan
)
cat("\nPasien :", laporan$Nama, "\n")
if (laporan$Triase == "Merah") {
cat("Status : PRIORITAS TINGGI (MERAH), skor", laporan$Skor, "\n")
} else if (laporan$Triase == "Kuning") {
cat("Status : PRIORITAS SEDANG (KUNING), skor", laporan$Skor, "\n")
} else if (laporan$Triase == "Hijau") {
cat("Status : PRIORITAS RENDAH (HIJAU), skor", laporan$Skor, "\n")
} else {
cat("Status : DATA BELUM VALID, triase belum dapat ditentukan\n")
}
cat("Tindakan:", laporan$Tindakan, "\n")
} else {
hasil_triase <- pasien[, c("ID", "Nama", "Jenis_Kelamin", "Umur", "IMT", "Status_Gizi",
"Status_Suhu", "Status_TD", "Status_Nadi", "Status_Data",
"Skor_Total", "Triase", "Tindakan")]
hasil_triase$Triase <- as.character(hasil_triase$Triase)
jumlah_triase <- table (pasien$Triase)
rekap<- data.frame(
Triase = names(jumlah_triase),
Jumlah = as.vector(jumlah_triase),
Persen = round(100*as.vector(jumlah_triase)/nrow(pasien),1)
)
lembar<- list(Hasil_Triase=hasil_triase,Rekap_Triase= rekap)
file_hasil <- file.path(dirname(alamat), "hasil_triase.xlsx")
write.xlsx(lembar, file_hasil, colWidths = "auto", overwrite = TRUE)
cat("\nSelesai. Hasil disimpan di:", file_hasil, "\n")
}Berkas input untuk mode 2 harus memiliki sepuluh kolom wajib (urutan
kolom bebas, tetapi nama kolom harus sama persis). Simpan sebagai
.csv atau .xlsx.
| Kolom | Ketentuan |
|---|---|
ID, Nama |
Teks bebas |
Jenis_Kelamin |
Hanya L atau P (huruf kapital) |
Umur |
Angka, tahun |
Berat |
Angka, kg |
Tinggi |
Angka, cm |
Suhu |
Angka, °C; gunakan titik untuk desimal |
Sistolik, Diastolik |
Angka, mmHg; diastolik harus lebih kecil daripada sistolik |
Nadi |
Angka, kali per menit |