Pertanyaan analisis jarang berbunyi “baris 1 sampai 12” — bentuk aslinya “hari apa saja yang penjualannya lesu: harga tinggi tetapi unit rendah?”, “tampilkan hanya minggu kedua”. Chapter Logical Indexing sudah memperkenalkan mask boolean untuk memungut elemen; sekarang kita angkat pola tersebut ke level observasi: menyaring BARIS dataset dengan kondisi pada kolom-kolomnya. Cakupan chapter ini:

  • Mask tunggal dan mask gabungan &/| pada kolom dataset
  • Mempertahankan hasil filter atau menghapus pelengkapnya
  • Pola window untuk rentang waktu
  • Filtering per baris matriks dengan all dan any

Dataset yang dipakai di chapter ini:

matlab
penjualan = [1 12 15000; 2 15 15000; 3 9 16000; 4 22 16000; 5 18 15000;
             6 7 17000; 7 25 15000; 8 11 16000; 9 14 17000; 10 20 16000;
             11 16 17000; 12 19 15000];   % kolom: hari, unit, harga
suhuKota = [30 31 32 31 33 34 32;
            26 27 28 29 28 27 26;
            29 30 31 32 33 32 31;
            33 35 36 34 32 31 30];        % 4 kota x 7 hari (derajat)

Mask Tunggal untuk Memilih Baris #

Aturannya: kondisi pada SATU kolom menghasilkan mask logical setinggi jumlah baris, dan mask tersebut dipasang di indeks baris — penjualan(mask, :) mengambil seluruh baris yang lolos dengan ketiga kolomnya. Mekanismenya: perbandingan penjualan(:, 3) > 15500 mengevaluasi tiap elemen kolom harga secara vektor, menghasilkan 12 nilai logical; MATLAB kemudian memungut baris-baris bertanda true dan menyusunnya sebagai matriks baru:

matlab
mahal = penjualan(:, 3) > 15500;
fprintf('baris harga > 15500: %d dari %d baris\n', sum(mahal), size(penjualan, 1));

Output yang Dihasilkan:

text
baris harga > 15500: 7 dari 12 baris

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (mahal = ...): kolom 12×1 dibandingkan dengan ambang skalar → mask logical 12×1; tujuh hari memakai harga di atas Rp15.500.
  2. Baris 2 (sum(mahal)): seperti dipelajari di Chapter Logical Indexing, true tersimpan sebagai 1 — menjumlahkan mask langsung menghitung baris yang lolos, dan size(penjualan, 1) menjadi penyebutnya.

Mask Gabungan: & dan | #

Pertanyaan nyata hampir selalu bersyarat majemuk: “harga tinggi DAN unit rendah”. Aturannya: operator & (dan) serta | (atau) versi elemen menggabungkan dua mask berukuran sama menjadi satu; ~ membaliknya. Mekanismenya: A & B bernilai true hanya pada posisi yang true di KEDUA mask, A | B cukup salah satu — perbedaan &/| dengan &&/|| yang khusus skalar sudah kita bahas tuntas di Chapter Operator Logika. Kurung pada tiap sisi operator menjaga maksud terbaca:

matlab
lesu = (penjualan(:, 3) > 15500) & (penjualan(:, 2) < 15);
fprintf('baris lesu (harga > 15500 & unit < 15):\n');
fprintf('%4d %5d %7d\n', penjualan(lesu, :).');

pinggir = (penjualan(:, 1) < 4) | (penjualan(:, 1) > 10);
fprintf('hari < 4 atau > 10: %d baris\n', sum(pinggir));

Output yang Dihasilkan:

text
baris lesu (harga > 15500 & unit < 15):
   3     9   16000
   6     7   17000
   8    11   16000
   9    14   17000
hari < 4 atau > 10: 5 baris

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (lesu = ...): dua mask 12×1 — harga tinggi (7 baris) dan unit rendah — berpotongan menjadi 4 baris: hari 3, 6, 8, 9; hari 4 dan 10 gugur karena unitnya di atas 15 meski harganya tinggi.
  2. Baris 2-3 (penjualan(lesu, :)): mask duduk di indeks baris, : di indeks kolom — seluruh variabel observasi lolos terbawa utuh.
  3. Baris 5 (pinggir = ... | ...): operator | memungut awal periode (hari 1-3) dan akhir periode (hari 11-12) sekaligus — 5 baris untuk laporan bandingkan awal-akhir.

Mempertahankan atau Menghapus #

Hasil filter bisa diperlakukan dua cara: disimpan sebagai dataset baru, atau dihapus pelengkapnya langsung dari dataset lama. Aturannya: pola simpan memakai penjualan(mask, :); pola hapus memakai negasi ~mask dengan assignment array kosong penjualan(~mask, :) = [] — idiom penghapusan baris dari Chapter Array Slicing. Mekanismenya: assignment [] menyusutkan matriks secara permanen, jadi pola hapus cocok saat dataset sumber memang ingin dirampingkan:

matlab
ringkas = penjualan;
ringkas(~lesu, :) = [];                  % hapus baris yang tidak lolos
fprintf('setelah hapus baris gagal: %d baris tersisa\n', size(ringkas, 1));

Output yang Dihasilkan:

text
setelah hapus baris gagal: 4 baris tersisa

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (ringkas = penjualan): salinan dibuat dulu supaya dataset asli tetap utuh — assignment di MATLAB menyalin nilai, bukan berbagi isi.
  2. Baris 2 (ringkas(~lesu, :) = []): baris yang TIDAK lolos mask lesu dihapus; 12 baris menyusut menjadi 4 baris yang identik dengan hasil pola simpan di atas.

Pola Window: Rentang Waktu #

Laporan mingguan meminta potongan antar dua tanggal — pola window. Aturannya: rentang dibangun dari dua perbandingan yang di-&-kan pada kolom waktu; batas bawah inklusif (>=), batas atas inklusif (<=), dan rentang terbuka cukup memilih operator yang tepat. Mekanismenya sama dengan mask gabungan — hanya variabel kuncinya kolom hari:

matlab
tengah = (penjualan(:, 1) >= 5) & (penjualan(:, 1) <= 8);
fprintf('window hari 5-8:\n');
fprintf('%4d %5d %7d\n', penjualan(tengah, :).');

Output yang Dihasilkan:

text
window hari 5-8:
   5    18   15000
   6     7   17000
   7    25   15000
   8    11   16000

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (tengah = ...): mask true hanya pada hari 5, 6, 7, 8 — batas ganda inilah yang membedakan window dari perbandingan tunggal.
  2. Baris 2-3 (penjualan(tengah, :)): empat observasi minggu tengah tercetak utuh; ganti angka 5 dan 8 untuk menggeser jendela, atau gunakan kolom tanggal saat data sudah bertipe waktu.

all dan any: Filter per Baris Matriks #

Kondisi kadang menyangkut SELURUH baris, bukan satu kolom: “kota mana yang setiap harinya hangat?”, “kota mana yang pernah ekstrem panas?”. Aturannya: all(mask, 2) bernilai true untuk baris yang lolos di SEMUA kolomnya, any(mask, 2) cukup SATU kolom — argumen 2 memproses sepanjang baris, dan keduanya menghasilkan mask setinggi jumlah baris yang siap dipakai sebagai indeks:

matlab
semuaHangat = all(suhuKota >= 28, 2);
pernahPanas = any(suhuKota > 34, 2);
fprintf('kota selalu >= 28 : '); fprintf('%d ', find(semuaHangat)); fprintf('\n');
fprintf('kota pernah > 34  : '); fprintf('%d ', find(pernahPanas)); fprintf('\n');
fprintf('baris kota panas:\n');
fprintf('%3d %3d %3d %3d %3d %3d %3d\n', suhuKota(pernahPanas, :).');

Output yang Dihasilkan:

text
kota selalu >= 28 : 1 3 4
kota pernah > 34  : 4
baris kota panas:
 33  35  36  34  32  31  30

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (all(suhuKota >= 28, 2)): suhuKota >= 28 adalah mask 4×7; all(..., 2) merangkum tiap baris menjadi satu nilai — kota 2 gagal karena dua harinya di bawah 28.
  2. Baris 2 (any(suhuKota > 34, 2)): hanya kota 4 yang pernah melewati 34 derajat (mencapai 35 dan 36).
  3. Baris 5 (suhuKota(pernahPanas, :)): mask hasil any langsung dipakai memilih baris kota — pola yang sama dengan filter dataset, kini diperoleh dari ringkasan per baris.

Berkas contoh.m pada bagian bawah halaman menjalankan seluruh pola tersebut — dari mask tunggal hingga all/any — dalam satu script utuh.

Ringkasan #

Filtering dataset adalah logical indexing yang dinaikkan ke baris: kondisi kolom menjadi mask 12×1, mask gabungan dirakit dengan &/|/~, dan penjualan(mask, :) mengeluarkan observasi utuh. Pola simpan menjaga data asli, pola hapus penjualan(~mask, :) = [] merampingkan dataset secara permanen. Window rentang memakai dua perbandingan pada kolom waktu, dan all/any dengan dimensi 2 menyaring baris menurut perilaku lintas kolom. Data yang tersaring siap dicari posisinya — chapter Searching Data berikutnya membahas find dan ismember.