Chapter Table dan Timetable di Section Pengolahan Data telah memperkenalkan table sebagai struktur berkolom bernama. Pendalaman kali ini menuntaskan perangkatnya: memberi nama pada baris, memodifikasi kolom sembari data berjalan, mengurutkan baris lewat beberapa kunci, membaca ringkasan statistik otomatis, dan — fitur paling penting untuk data nyata — menggabungkan dua table dengan innerjoin/outerjoin layaknya query SQL. Chapter ini juga menutup siklus data dengan konversi balik ke matriks/cell dan ekspor ke berkas CSV.

Membuat Table dan Menamai Kolomnya #

Aturannya: table(var1, var2, ...) merangkai variabel-variabel berjumlah baris sama menjadi satu tabel, dan 'VariableNames' menamai tiap kolom. Mekanismenya: setiap argumen menjadi satu variable tersimpan sebagai kolom — MATLAB menyimpan nama kolom di properti T.Properties.VariableNames dan menjaga jumlah baris konsisten di seluruh variabel.

matlab
nama  = {'Kopi'; 'Teh'; 'Gula'; 'Susu'};
stok  = [120; 200; 80; 50];
harga = [15000; 8000; 12000; 20000];

T = table(nama, stok, harga, ...
          'VariableNames', {'Nama', 'Stok', 'Harga'});
disp(T)

Output yang Dihasilkan:

text
    Nama       Stok    Harga
    _______    ____    ______

    {'Kopi'}    120    15000
    {'Teh' }    200     8000
    {'Gula'}     80    12000
    {'Susu'}     50    20000

Mari kita bedah baris-baris kode di atas:

  1. Baris 1-3 (tiga variabel): nama adalah cell 4×1 (kolom teks), stok dan harga vektor kolom 4×1 — semua harus berbaris sama banyak.
  2. Baris 5-6 (table(...)): tiga variabel menjadi tiga kolom; 'VariableNames' berisi cell berisi nama dalam urutan yang sama.
  3. disp(T): Command Window menampilkan tabel rapi — kolom Nama bertanda {'...'} karena isinya cell array.

Row names — label baris, bukan data — ditambahkan lewat 'RowNames':

matlab
kode = {'K001'; 'K002'; 'K003'; 'K004'};
T2 = table(stok, harga, 'VariableNames', {'Stok', 'Harga'}, ...
           'RowNames', kode);
T2('K002', :)

Output yang Dihasilkan:

text
ans =
  1×2 table

       Stok    Harga
       ____    ____

    K002    200     8000

Baris K002 diakses langsung dengan namanya — row names menjadi indeks yang terbaca manusia. Fungsi height(T) melaporkan jumlah baris dan width(T) jumlah variabel; keduanya lebih ekspresif daripada size(T) untuk table.

Tiga Jalur Akses: Dot, Kurung, Kurung Kurawal #

Pengantar sebelumnya telah memetakan tiga jalur akses; tabel berikut melengkapi variasinya:

SintaksMengembalikanTipe hasil
T.Hargaseluruh kolomarray 4×1
T.Harga(2:3)potongan kolomarray 2×1
T{2, 'Harga'}satu elemenskalar
T(1:2, {'Nama','Stok'})dua baris, dua kolomtable 2×2
T(T.Stok > 100, :)baris yang lolos masktable
matlab
fprintf('Kolom Stok (dot)  : class %s, size %dx%d\n', ...
        class(T.Stok), size(T.Stok, 1), size(T.Stok, 2));
fprintf('Elemen T{2,Harga} : %d\n', T{2, 'Harga'});
Tlaris = T(T.Stok > 100, :);
fprintf('Produk stok > 100 : %d baris\n', height(Tlaris));

Output yang Dihasilkan:

text
Kolom Stok (dot)  : class double, size 4x1
Elemen T{2,Harga} : 8000
Produk stok > 100 : 2 baris

Mekanismenya: T.Stok mengeluarkan kolom sebagai array biasa sehingga mask T.Stok > 100 adalah logical 4×1 [1 1 0 0] — Kopi (120) dan Teh (200) lolos. Mask ini bekerja persis seperti logical indexing pada matriks, hanya saja indeks barisnya diterapkan pada baris tabel.

Menambah dan Menghapus Variabel #

Aturannya: assignment dot T.Baru = ... menambah kolom, sedangkan T(:, 'Lama') = [] menghapusnya. Mekanismenya: kolom baru divalidasi jumlah barisnya dulu, lalu menempel di posisi paling kanan; penghapusan memakai notasi matriks [] pada seluruh baris kolom tersebut.

matlab
T.Nilai = T.Harga .* T.Stok;              % kolom baru hasil hitung
fprintf('Total nilai inventori : Rp%d\n', sum(T.Nilai));

TtanpaHarga = T;
TtanpaHarga(:, 'Harga') = [];             % hapus kolom Harga
fprintf('Setelah hapus Harga   : %d variabel\n', width(TtanpaHarga));

Output yang Dihasilkan:

text
Total nilai inventori : Rp5360000
Setelah hapus Harga   : 3 variabel

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (T.Nilai = T.Harga .* T.Stok): operasi element-wise antar dua kolom menghasilkan kolom baru [1800000 1600000 960000 1000000]; total 5.360.000 rupiah tercetak dari sum.
  2. Baris 4-5 (salinan lalu hapus): T disalin dulu ke TtanpaHarga supaya tabel asli tetap utuh; width turun dari 4 menjadi 3 variabel (Nama, Stok, Nilai).

Mengurutkan Baris dengan sortrows #

Aturannya: sortrows(T, kolomKunci, arah) mengurutkan baris utuh mengikuti kolom kunci — 'descend' membalik arah, dan sel array {'A','B'} mengurutkan berjenjang (tie-break). Mekanismenya: sortrows memindahkan baris tabel secara utuh, menjaga seluruh kolom pada baris yang sama tetap bersama.

matlab
Turut = sortrows(T, 'Stok', 'descend');
Turut(1:2, :)

Output yang Dihasilkan:

text
ans =
  2×4 table

    Nama       Stok    Harga      Nilai
    _______    ____    ______    _________

    {'Teh' }    200      8000     1600000
    {'Kopi'}    120    15000     1800000

Baris Teh (stok 200) dan Kopi (stok 120) naik ke dua posisi teratas — seluruh kolom, termasuk Nilai yang baru ditambahkan, ikut pindah tanpa tertukar. Sintaks sortrows(T, 'RowNames') mengurutkan berdasarkan nama baris untuk tabel yang memilikinya.

Ringkasan Statistik dengan summary #

Aturannya: summary(T) memeriksa seluruh tabel sekali jalan — tipe tiap variabel, jumlah data hilang, dan statistik kolom numerik. Mekanismenya: MATLAB membaca metadata tabel lalu menghitung statistik default (NumMissing, Min, Median, Max, Mean, Std) pada tiap kolom yang numerik.

matlab
summary(T)

Output yang Dihasilkan:

text
Variables:

    Nama: cell (4 rows)

    Stok: double

        NumMissing    Min    Median    Max    Mean     Std
             0          50      100    200    112.5    64.87

    Harga: double

        NumMissing    Min    Median    Max    Mean     Std
             0         8000    13500   20000   13750    5058

    Nilai: double

        NumMissing      Min        Median      Max       Mean       Std
             0         960000    1.3e+06    1.8e+06    1.34e+06    4.24e+05

Statistik tersebut bisa dibaca ulang dengan ilmu chapter Statistical Summary: median([120 200 80 50]) = 100, mean = 450/4 = 112.5. Untuk tabel besar, head(T, 5) dan tail(T, 5) mengintip cuplikan tanpa membanjiri layar.

Menggabungkan Dua Table: innerjoin dan outerjoin #

Masalah nyatanya: data inventori dan data kategori produk sering tinggal di dua tabel berbeda. Aturannya: innerjoin(Tleft, Tright) hanya mengeksekusi baris yang kuncinya berpasangan di kedua tabel; outerjoin mempertahankan semua baris dan mengisi sel tanpa pasangan dengan nilai hilang. Mekanismenya: kedua fungsi mencocokkan key variable — kolom bernama sama di kedua tabel — lalu merangkai sisa kolomnya.

matlab
Tleft  = table({'Kopi'; 'Teh'; 'Gula'}, [120; 200; 80], ...
                'VariableNames', {'Nama', 'Stok'});
Tright = table({'Kopi'; 'Teh'; 'Gula'; 'Susu'}, ...
                {'Minuman'; 'Minuman'; 'Sembako'; 'Minuman'}, ...
                'VariableNames', {'Nama', 'Kategori'});

Tinner = innerjoin(Tleft, Tright)
Touter = outerjoin(Tleft, Tright, 'MergeKeys', true)

Output yang Dihasilkan:

text
Tinner =
  3×3 table

    Nama       Stok    Kategori
    _______    ____    _________

    {'Gula'}     80    {'Sembako'}
    {'Kopi'}    120    {'Minuman'}
    {'Teh' }    200    {'Minuman'}

Touter =
  4×3 table

    Nama       Stok     Kategori
    _______    _____    _________

    {'Gula'}      80    {'Sembako'}
    {'Kopi'}     120    {'Minuman'}
    {'Susu'}     NaN    {'Minuman'}
    {'Teh' }     200    {'Minuman'}

Mari kita bedah hasil tersebut:

  1. innerjoin: Susu tidak punya pasangan di Tleft, jadi lenyap; hasilnya diurutkan menurut key Nama — perilaku bawaan innerjoin.
  2. outerjoin: semua baris dari kedua tabel hadir; baris Susu tidak ditemukan di Tleft sehingga kolom Stok diisi NaN.
  3. 'MergeKeys', true: key Nama dilebur menjadi satu kolom. Tanpa opsi ini, outerjoin menampilkan dua kolom kunci terpisah (Nama_Tleft dan Nama_Tright) dengan penanda nilai hilang di masing-masing.

Konversi dan Ekspor #

Data kadang harus meninggalkan dunia table: algoritma numerik murni menuntut matriks, antarmuka lama menuntut cell, dan laporan menuntut berkas. Tiga fungsi menutup siklus tersebut:

matlab
A = table2array(T(:, {'Stok', 'Harga'}));  % kembali ke matriks
C = table2cell(T(:, {'Nama', 'Stok'}));    % kembali ke cell array
writetable(T, 'inventori.csv');            % ekspor CSV

Mekanismenya: table2array melepas nama kolom dan menyerahkan blok numerik 4×2; table2cell membungkus setiap elemen menjadi sel; writetable menulis CSV dengan nama kolom sebagai baris header (dinonaktifkan lewat 'WriteVariableNames', false). File inventori.csv hasilnya bisa dibaca kembali dengan readtable — round-trip yang diperkenalkan di chapter Pengolahan Data.

Ringkasan #

Table dibuat dengan table(...) plus 'VariableNames'/'RowNames'; akses datanya tiga jalur (dot, kurung, kurung kurawal) dengan tipe hasil berbeda. Kolom ditambah dengan assignment dot dan dihapus dengan T(:, 'nama') = []; sortrows mengurutkan baris utuh; summary menghitung statistik seluruh kolom otomatis. Dua tabel digabungkan dengan innerjoin (hanya baris berpasangan) atau outerjoin (semua baris, nilai hilang diisi NaN/<missing>). table2array/table2cell mengembalikan data ke bentuk klasik, dan writetable mengekspornya ke CSV. Berkas contoh.m merangkai seluruh alur tersebut dalam satu skrip MATLAB.