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


DAFTAR ISI


BAB I PENDAHULUAN

1.1 Latar Belakang Kasus

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.

1.2 Deskripsi Kasus

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:

  1. Pita merah: peserta memerlukan perhatian segera dan penilaian langsung oleh tenaga kesehatan.
  2. Pita kuning: peserta memerlukan pemeriksaan lanjutan atau pemantauan oleh tenaga kesehatan.
  3. Pita hijau: skor total rendah sehingga tidak ditemukan parameter yang memenuhi aturan peringatan dalam simulasi, tetapi peserta tetap dapat memerlukan pemeriksaan apabila mengalami keluhan.
  4. Perlu Diukur Ulang: data kosong atau berada di luar rentang yang wajar sehingga kategori prioritas belum dapat ditentukan.

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.

1.3 Rumusan Masalah

Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah:

  1. Bagaimana merancang algoritma untuk mengolah data peserta posko kesehatan menggunakan bahasa pemrograman R?
  2. Bagaimana memasukkan data peserta, baik secara manual untuk satu peserta maupun dari berkas CSV dan Excel untuk banyak peserta?
  3. Bagaimana memeriksa kelengkapan kolom dan kewajaran nilai data sebelum diklasifikasikan?
  4. Bagaimana menerapkan percabangan kondisi dan sistem skor untuk menentukan kategori prioritas berdasarkan parameter numerik?
  5. Bagaimana menampilkan hasil klasifikasi setiap peserta secara sistematis?
  6. Bagaimana membuat rekapitulasi jumlah peserta berdasarkan kategori merah, kuning, hijau, dan perlu diukur ulang, serta menyimpannya ke berkas Excel?

1.4 Tujuan Praktikum

Praktikum ini bertujuan untuk:

  1. Memahami penerapan algoritma dalam menyelesaikan kasus sederhana di lingkungan kampus.
  2. Menerapkan input dan output data menggunakan bahasa pemrograman R, termasuk membaca berkas CSV dan Excel serta menyimpan hasil ke berkas Excel.
  3. Mengolah data numerik berupa berat badan, tinggi badan, suhu tubuh, tekanan darah, dan denyut nadi.
  4. Menerapkan validasi data untuk mendeteksi kolom yang tidak lengkap dan nilai yang tidak wajar.
  5. Menerapkan struktur percabangan (if, else if, else, case_when(), dan if_else()) dalam proses klasifikasi.
  6. Menerapkan pemrosesan banyak peserta sekaligus menggunakan operasi vektor dan fungsi lapply() pada data frame.
  7. Menampilkan hasil klasifikasi dan rekapitulasi data secara terstruktur.

1.5 Manfaat Praktikum

Manfaat yang diharapkan dari praktikum ini adalah:

  1. Bagi mahasiswa: meningkatkan pemahaman tentang algoritma, pengolahan data, dan pemrograman R.
  2. Bagi kegiatan kampus: memberikan gambaran mengenai penggunaan program sederhana untuk mencatat dan mengelompokkan hasil pemeriksaan awal.
  3. Bagi pengembangan sistem: menjadi dasar untuk pengembangan aplikasi pencatatan kesehatan yang lebih lengkap dengan validasi dan pengawasan tenaga kesehatan.

1.6 Batasan Sistem

Agar pembahasan lebih terarah, sistem memiliki batasan sebagai berikut.

  1. Program merupakan simulasi akademik dan bukan alat diagnosis maupun sistem triase klinis yang telah tervalidasi.
  2. Data yang diolah meliputi ID, nama, jenis kelamin, umur, berat badan, tinggi badan, suhu tubuh, tekanan darah sistolik, tekanan darah diastolik, dan denyut nadi.
  3. Status prioritas simulasi ditentukan berdasarkan skor suhu tubuh, tekanan darah, dan denyut nadi. Umur dan jenis kelamin hanya digunakan dalam validasi data, tidak dalam penghitungan skor.
  4. IMT dihitung untuk menghasilkan kategori status gizi sederhana dan tidak menjadi bagian dari skor prioritas.
  5. Rentang nilai dan aturan klasifikasi yang digunakan merupakan aturan pemrograman untuk demonstrasi, bukan jaminan bahwa kondisi seseorang sehat atau tidak sehat.
  6. Program dijalankan secara interaktif melalui RStudio. Mode input manual hanya untuk satu peserta, sedangkan mode berkas untuk banyak peserta.
  7. Penggunaan pada situasi nyata harus mengikuti prosedur keselamatan, perlindungan data pribadi, dan arahan tenaga kesehatan.

BAB II LANDASAN TEORI

2.1 Algoritma

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

2.2 Bahasa Pemrograman R

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

2.3 Input, Proses, dan Output

Konsep Input–Process–Output (IPO) digunakan untuk menjelaskan alur kerja program.

  • Input: pilihan mode, identitas peserta, dan hasil pengukuran parameter kesehatan (diketik atau dibaca dari berkas CSV/Excel).
  • Proses: pemeriksaan kolom wajib, konversi tipe data, pemeriksaan validitas rentang nilai, penghitungan IMT, penentuan status parameter, penghitungan skor, penentuan kategori dengan percabangan, dan penghitungan jumlah peserta per kategori.
  • Output: tabel hasil triase, laporan satu peserta (mode 1), serta berkas Excel berisi hasil dan rekapitulasi kategori (mode 2).

2.4 Variabel dan Tipe Data

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

2.5 Operator

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.

2.6 Percabangan

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

2.7 Perulangan dan Vektorisasi

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:

  • operasi vektor, misalnya 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.

2.8 Data Frame dan Rekapitulasi

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.

2.9 Parameter Pemeriksaan Awal dan Konsep Triase

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.


BAB III PERANCANGAN SISTEM

3.1 Nama Sistem

Sistem Klasifikasi Prioritas Kesehatan Peserta Kegiatan Kampus Berbasis R.

3.2 Gambaran Umum Sistem

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.

3.3 Data Masukan

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.

3.4 Aturan Validasi Data

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.

3.5 Aturan Klasifikasi dan Skor

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

3.6 Alur Sistem

  1. Program dimulai dan meminta pengguna memilih mode input.
  2. Data peserta diperoleh dari ketikan (mode 1) atau dari berkas CSV/Excel (mode 2). Pada mode 2, program memeriksa kelengkapan kolom wajib.
  3. Kolom angka diubah menjadi tipe numerik.
  4. Program memeriksa validitas data dan memberi Status_Data.
  5. Program menghitung IMT dan menentukan status gizi, status suhu, status tekanan darah, dan status nadi.
  6. Program menghitung skor setiap parameter dan skor total.
  7. Program menentukan kategori triase dan tindakan awal.
  8. Program menampilkan hasil. Untuk satu peserta ditampilkan laporan singkat; untuk banyak peserta dibuat rekapitulasi dan hasilnya disimpan ke berkas Excel.

3.7 Algoritma

  1. Mulai.
  2. Muat paket dplyr, readxl, dan openxlsx; tetapkan daftar kolom angka dan kolom wajib.
  3. Tampilkan judul program dan minta pengguna memilih mode (1 atau 2).
  4. Jika mode = 1, minta pengguna mengetikkan ID, nama, jenis kelamin, umur, berat, tinggi, suhu, sistolik, diastolik, dan nadi, lalu simpan sebagai data frame satu baris.
  5. Jika mode = 2, buka jendela pemilihan berkas, baca berkas sebagai CSV atau Excel sesuai ekstensinya, lalu periksa apakah semua kolom wajib ada. Jika tidak lengkap, hentikan program dengan pesan kesalahan.
  6. Jika mode bukan 1 atau 2, hentikan program dengan pesan “Pilihan tidak valid”.
  7. Ubah semua kolom angka menjadi numerik.
  8. Periksa rentang nilai setiap peserta. Jika semua syarat terpenuhi, Status_Data = “Valid”; selain itu “Perlu Diukur Ulang”.
  9. Hitung IMT = Berat / (Tinggi/100)² dan tentukan status gizi.
  10. Tentukan status suhu:
    • Suhu < 35: Hipotermia
    • Suhu < 37,5: Normal
    • Suhu < 39: Demam
    • Selain itu: Demam Tinggi
  11. Tentukan status tekanan darah:
    • Sistolik ≥ 180 atau diastolik ≥ 120: Krisis Hipertensi
    • Sistolik ≥ 140 atau diastolik ≥ 90: Hipertensi
    • Sistolik ≥ 120 atau diastolik ≥ 80: Meningkat
    • Sistolik < 90 atau diastolik < 60: Rendah
    • Selain itu: Normal
  12. Tentukan status nadi:
    • Nadi < 60: Bradikardia
    • Nadi ≤ 100: Normal
    • Nadi < 140: Takikardia
    • Selain itu: Takikardia Berat
  13. Ubah status menjadi skor:
    • Skor suhu: Normal = 0, Demam = 1, lainnya = 2
    • Skor tekanan darah: Normal = 0, Meningkat atau Rendah = 1, Hipertensi = 2, lainnya = 3
    • Skor nadi: Normal = 0, Bradikardia atau Takikardia = 1, lainnya = 2
  14. Hitung Skor_Total = skor suhu + skor tekanan darah + skor nadi. Jika data “Perlu Diukur Ulang”, isi Skor_Total dengan NA.
  15. Tentukan Triase:
    • Jika data perlu diukur ulang: “Perlu Diukur Ulang”
    • Jika Skor_Total ≥ 5 atau skor tekanan darah = 3: “Merah”
    • Jika Skor_Total ≥ 2: “Kuning”
    • Selain itu: “Hijau”
  16. Tentukan Tindakan sesuai kategori triase.
  17. Tampilkan tabel hasil triase.
  18. Jika jumlah peserta = 1, tampilkan laporan satu peserta (nama, status prioritas, skor, tindakan).
  19. Jika jumlah peserta lebih dari 1, susun tabel hasil dan rekapitulasi (jumlah dan persen per kategori), lalu simpan ke hasil_triase.xlsx di folder yang sama dengan berkas input.
  20. Selesai.

BAB IV IMPLEMENTASI PROGRAM

4.1 Perangkat yang Digunakan

  1. Laptop, digunakan untuk menjalankan dan menyusun program.

  2. R dan RStudio, digunakan untuk menulis, menjalankan, dan menguji program menggunakan bahasa R.

  3. Paket R: dplyr, readxl, dan openxlsx. Jika belum terpasang, jalankan perintah berikut satu kali pada console:

    install.packages(c("dplyr", "readxl", "openxlsx"))
  4. Microsoft Excel (atau aplikasi spreadsheet lain), digunakan untuk menyiapkan berkas input dan melihat berkas hasil.

4.2 Fungsi yang Digunakan

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

4.3 Alur Implementasi Program

Implementasi program dilakukan melalui beberapa tahapan berikut.

  1. Persiapan program, yaitu menyiapkan RStudio, memanggil paket yang diperlukan, dan menetapkan daftar kolom angka serta kolom wajib.
  2. Pemilihan mode dan pembacaan data, yaitu memasukkan data satu peserta melalui ketikan atau membaca data banyak peserta dari berkas CSV/Excel.
  3. Pemeriksaan data, yaitu memeriksa kelengkapan kolom wajib, mengubah kolom angka menjadi numerik, dan memeriksa kewajaran rentang nilai.
  4. Pengolahan parameter kesehatan, yaitu menghitung IMT serta menentukan status suhu, tekanan darah, dan denyut nadi.
  5. Penentuan skor, yaitu mengubah status setiap parameter menjadi skor dan menjumlahkannya.
  6. Penentuan kategori dan tindakan, yaitu menetapkan triase (Merah, Kuning, Hijau, atau Perlu Diukur Ulang) beserta tindakan awal yang disarankan.
  7. Penampilan dan penyimpanan hasil, yaitu menampilkan tabel di console, menampilkan laporan satu peserta, atau menyimpan hasil dan rekap ke berkas Excel.

4.4 Penjelasan Kode

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:

  • Satu peserta: data dirangkum dalam 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.
  • Lebih dari satu peserta: disusun data frame 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.

4.5 Cara Menjalankan Program

  1. Buka RStudio, lalu buka berkas skrip program (Lampiran A).
  2. Pasang paket yang diperlukan (lihat 4.1) bila belum terpasang.
  3. Jalankan skrip dengan Source (tombol Source, atau pintasan 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.
  4. Ketik 1 atau 2 pada console, lalu tekan Enter.
  5. Mode 1: jawab setiap pertanyaan satu per satu (ID, nama, jenis kelamin L/P, umur, berat, tinggi, suhu, sistolik, diastolik, nadi). Gunakan titik sebagai pemisah desimal (misalnya 37.5).
  6. Mode 2: pilih berkas CSV atau Excel pada jendela yang muncul. Pastikan nama kolom sesuai ketentuan pengisian pada Lampiran B.
  7. Baca hasil pada console. Pada mode 2, berkas hasil_triase.xlsx otomatis dibuat di folder yang sama dengan berkas input, dan lokasinya dicetak pada baris “Selesai. Hasil disimpan di: …”.
  8. Jika berkas hasil_triase.xlsx sedang terbuka di Excel, tutup terlebih dahulu sebelum menjalankan ulang agar berkas dapat ditimpa.

4.6 Hasil Implementasi Program

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.

4.7 Keterbatasan Sistem

Program memiliki beberapa keterbatasan sebagai berikut.

  1. Batas kategori dan skor merupakan aturan sederhana yang belum divalidasi untuk penggunaan klinis.
  2. Program hanya memeriksa rentang nilai, sehingga tidak dapat memastikan bahwa pengukuran dilakukan dengan benar.
  3. Kategori IMT yang digunakan tidak otomatis sesuai untuk semua kelompok usia.
  4. Umur dan jenis kelamin tidak memengaruhi skor, padahal batas normal beberapa parameter dapat berbeda antarkelompok.
  5. Sistem skor penjumlahan membuat kombinasi penyimpangan berat tertentu (misalnya demam tinggi dan takikardia berat, skor total 4) tetap berkategori kuning.
  6. Pada status tekanan darah, kondisi “Meningkat” diperiksa sebelum “Rendah”. Akibatnya, peserta dengan sistolik rendah tetapi diastolik ≥ 80 (misalnya 85/82) berstatus Meningkat, bukan Rendah.
  7. Program belum menangani seluruh kemungkinan kesalahan input, seperti nama atau ID kosong, ID ganda, serta penulisan jenis kelamin selain L/P huruf kapital (dianggap tidak valid).
  8. Program memerlukan nama kolom yang sesuai agar berkas dapat dibaca dengan benar.
  9. Pada mode 2, berkas yang hanya berisi satu peserta diperlakukan seperti mode 1 sehingga hasilnya tidak diekspor ke Excel. Mode 1 sendiri juga tidak menyimpan hasil ke berkas.
  10. Program belum memiliki pemeriksaan khusus untuk berkas tanpa data peserta. Pada kondisi ini rekap tidak bermakna karena persentase dihitung dari jumlah peserta nol.
  11. Program memakai readline() dan file.choose() sehingga hanya dapat dijalankan secara interaktif (misalnya di RStudio), bukan sebagai skrip otomatis tanpa interaksi.
  12. Data peserta merupakan informasi pribadi sehingga harus dijaga kerahasiaannya.
  13. Kategori yang dihasilkan tidak boleh dijadikan dasar tunggal untuk menentukan kondisi medis, menunda pertolongan, atau menggantikan pemeriksaan tenaga kesehatan.

BAB V PENUTUP

5.1 Kesimpulan

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.

5.2 Saran

Pengembangan selanjutnya dapat mencakup:

  1. validasi input yang lebih lengkap, misalnya pemeriksaan data kosong, ID ganda, nama kosong, dan penyeragaman huruf pada jenis kelamin;
  2. penambahan pencatatan keluhan dan tingkat kesadaran dengan pengawasan tenaga kesehatan;
  3. penyimpanan hasil untuk mode input manual dan untuk berkas satu peserta;
  4. penyimpanan data yang lebih aman;
  5. pengembangan antarmuka yang mudah digunakan, misalnya aplikasi Shiny.

Apabila akan diterapkan dalam kegiatan nyata, aturan prioritas harus ditentukan dan disetujui oleh tenaga kesehatan yang berwenang.



LAMPIRAN A Kode Program Lengkap

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

LAMPIRAN B Ketentuan Pengisian Berkas Input

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