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:
dplyr: menyediakan if_else() dan
case_when() untuk pengelompokan berdasarkan kondisi.readxl: membaca berkas Excel dengan
read_excel().openxlsx: menulis hasil ke berkas Excel dengan beberapa
lembar melalui 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.
character: teks, misalnya pilihan,
alamat, serta kolom Nama dan
Status_Suhu.numeric: angka, misalnya kolom Umur,
Suhu, IMT, dan Skor_Total.logical: nilai benar atau salah
(TRUE/FALSE), misalnya
rentang_valid.factor: data kategori dengan urutan level tetap,
misalnya kolom Triase.vector: kumpulan nilai bertipe sama, misalnya
kolom_angka dan kolom_wajib.list: kumpulan nilai berbeda tipe, misalnya
laporan dan lembar.data.frame: tabel berbaris dan berkolom, misalnya
pasien, hasil_triase, dan
rekap.NA: nilai hilang atau tidak tersedia, misalnya skor
total pada data yang perlu diukur ulang.Operator merupakan simbol yang digunakan untuk melakukan perhitungan atau membandingkan nilai dalam program.
<- memberikan nilai ke variabel.+, /, dan ^ menjumlahkan
skor, membagi, dan memangkatkan (rumus IMT).== memeriksa kesamaan nilai.>=, <=, <, dan
> 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().%>% adalah 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.
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.")
}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.
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.
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:
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.
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.
Kondisi diperiksa dari atas ke bawah dan 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 |
Status gizi tidak masuk skor prioritas.
IMT dihitung dengan rumus berikut:
IMT = Berat (kg) / (Tinggi (cm) / 100)^2
Hasilnya dibulatkan satu angka di belakang koma.
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 bawaan R:
c() membuat
vektor, list() membuat daftar (laporan dan lembar Excel),
data.frame() membuat tabel data,
as.data.frame() mengubah objek menjadi data frame,
factor() membuat data kategori dengan level berurutan, dan
as.vector() mengubah tabel frekuensi menjadi vektor.readline() menerima masukan teks
dari pengguna, cat() menampilkan teks pada konsol,
print() menampilkan tabel hasil pengolahan,
file.choose() membuka jendela pemilihan berkas, dan
read.csv() membaca berkas CSV.endsWith() memeriksa
akhiran teks (ekstensi berkas), tolower() mengubah teks
menjadi huruf kecil, paste() menggabungkan teks,
as.character() mengubah nilai menjadi teks,
file.path() membentuk alamat berkas keluaran, dan
dirname() mengambil lokasi folder dari suatu alamat
berkas.names() mengambil
nama kolom, all() memeriksa apakah semua nilai logika
bernilai benar, is.na() memeriksa nilai hilang, dan
stop() menghentikan program dengan pesan kesalahan.as.numeric() mengubah
nilai menjadi tipe numerik, round() membulatkan IMT dan
persentase, nrow() menghitung jumlah baris,
table() menghitung frekuensi tiap kategori,
lapply() menerapkan fungsi pada setiap kolom, dan
ifelse() memilih teks berdasarkan kondisi (untuk tampilan
mode).library() memanggil paket.Fungsi dari paket tambahan:
read_excel() dari readxl membaca data dari
berkas Excel.if_else() dari dplyr menentukan hasil
berdasarkan kondisi logika.case_when() dari dplyr mengelompokkan
nilai ke dalam beberapa kategori.write.xlsx() dari 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.
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.
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.
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.
} 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.
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.
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”.
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).
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.
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.
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.
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 uji pada berkas
data_CM.xlsx. Contoh berikut menunjukkan bentuk keluaran
program.
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
Data uji 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.
Id menjadi ID.Nama tetap Nama.Jenis Kelamin menjadi Jenis_Kelamin.Umur tetap Umur.Berat Badan (Kg) menjadi Berat.Tinggi Badan(cm) menjadi Tinggi.Suhu Tubuh menjadi Suhu.Sistolik dan Diastolik tetap sama.Denyut Nadi menjadi Nadi.Setelah penyesuaian nama kolom, data uji yang dibaca program adalah sebagai berikut.
| ID | Nama | Jenis_Kelamin | Umur | Berat | Tinggi | Suhu | Sistolik | Diastolik | Nadi |
|---|---|---|---|---|---|---|---|---|---|
| P001 | Budi Santoso | L | 17 | 54 | 158 | 36.5 | 110 | 70 | 72 |
| P002 | Siti Aminah | P | 18 | 61 | 165 | 36.8 | 118 | 76 | 78 |
| P003 | Agus Prasetyo | L | 20 | 48 | 152 | 36.4 | 104 | 66 | 68 |
| P004 | Dewi Lestari | P | 19 | 66 | 170 | 36.7 | 122 | 79 | 84 |
| P005 | Slamet Riyadi | L | 22 | 58 | 160 | 36.6 | 112 | 72 | 75 |
| P006 | Sri Wahyuni | P | 16 | 72 | 176 | 37 | 125 | 80 | 90 |
| P007 | Joko Widodo | L | 18 | 50 | 155 | 36.5 | 106 | 64 | 70 |
| P008 | Rina Marlina | P | 18 | 63 | 167 | 36.9 | 116 | 75 | 80 |
| P009 | Bima Hartono | L | 23 | 57 | 162 | 36.3 | 108 | 68 | 74 |
| P010 | Ani Rahayu | P | 17 | 69 | 172 | 36.8 | 120 | 78 | 86 |
| P011 | Eko Nugroho | L | 18 | 52 | 156 | 36.6 | 102 | 62 | 66 |
| P012 | Yuni Astuti | P | 20 | 60 | 164 | 37.1 | 114 | 74 | 82 |
| P013 | Hendra Saputra | L | 17 | 47 | 150 | 36.4 | 100 | 63 | 69 |
| P014 | Lia Permata | P | 19 | 65 | 169 | 36.7 | 119 | 77 | 88 |
| P015 | Tono Suharto | L | 17 | 55 | 159 | 36.5 | 109 | 69 | 73 |
| P016 | Maya Sari | P | 20 | 71 | 175 | 36.9 | 124 | 80 | 92 |
| P017 | Rudi Hermawan | L | 21 | 49 | 153 | 36.2 | 105 | 65 | 67 |
| P018 | Fitri Handayani | P | 20 | 62 | 166 | 36.8 | 117 | 73 | 79 |
| P019 | Wawan Setia | L | 22 | 56 | 161 | 36.6 | 111 | 71 | 76 |
| P020 | Nur Hidayah | P | 19 | 68 | 173 | 37 | 123 | 79 | 89 |
Setelah berkas dipilih, program mencetak tabel hasil triase di
console dan menyimpan berkas hasil_triase.xlsx di folder
yang sama dengan berkas input. Lembar Hasil_Triase memuat tiga belas
kolom; tabel berikut menampilkan kolom utamanya. Kolom Status_Suhu dan
Status_Nadi bernilai Normal, Status_Data bernilai Valid, dan Tindakan
berisi anjuran kategori Hijau untuk seluruh peserta.
| ID | Nama | IMT | Status_Gizi | Status_TD | Skor_Total | Triase |
|---|---|---|---|---|---|---|
| P001 | Budi Santoso | 21.6 | Normal | Normal | 0 | Hijau |
| P002 | Siti Aminah | 22.4 | Normal | Normal | 0 | Hijau |
| P003 | Agus Prasetyo | 20.8 | Normal | Normal | 0 | Hijau |
| P004 | Dewi Lestari | 22.8 | Normal | Meningkat | 1 | Hijau |
| P005 | Slamet Riyadi | 22.7 | Normal | Normal | 0 | Hijau |
| P006 | Sri Wahyuni | 23.2 | Normal | Meningkat | 1 | Hijau |
| P007 | Joko Widodo | 20.8 | Normal | Normal | 0 | Hijau |
| P008 | Rina Marlina | 22.6 | Normal | Normal | 0 | Hijau |
| P009 | Bima Hartono | 21.7 | Normal | Normal | 0 | Hijau |
| P010 | Ani Rahayu | 23.3 | Normal | Meningkat | 1 | Hijau |
| P011 | Eko Nugroho | 21.4 | Normal | Normal | 0 | Hijau |
| P012 | Yuni Astuti | 22.3 | Normal | Normal | 0 | Hijau |
| P013 | Hendra Saputra | 20.9 | Normal | Normal | 0 | Hijau |
| P014 | Lia Permata | 22.8 | Normal | Normal | 0 | Hijau |
| P015 | Tono Suharto | 21.8 | Normal | Normal | 0 | Hijau |
| P016 | Maya Sari | 23.2 | Normal | Meningkat | 1 | Hijau |
| P017 | Rudi Hermawan | 20.9 | Normal | Normal | 0 | Hijau |
| P018 | Fitri Handayani | 22.5 | Normal | Normal | 0 | Hijau |
| P019 | Wawan Setia | 21.6 | Normal | Normal | 0 | Hijau |
| P020 | Nur Hidayah | 22.7 | Normal | Meningkat | 1 | Hijau |
Isi lembar Rekap_Triase adalah sebagai berikut.
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.
ID dan Nama: teks bebas.Jenis_Kelamin: hanya L atau P
(huruf kapital).Umur: angka, dalam tahun.Berat: angka, dalam kg.Tinggi: angka, dalam cm.Suhu: angka, dalam °C; gunakan titik untuk
desimal.Sistolik dan Diastolik: angka, dalam mmHg;
diastolik harus lebih kecil daripada sistolik.Nadi: angka, dalam kali per menit.