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.
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:
Nama Stok Harga
_______ ____ ______
{'Kopi'} 120 15000
{'Teh' } 200 8000
{'Gula'} 80 12000
{'Susu'} 50 20000Mari kita bedah baris-baris kode di atas:
- Baris 1-3 (tiga variabel):
namaadalah cell 4×1 (kolom teks),stokdanhargavektor kolom 4×1 — semua harus berbaris sama banyak. - Baris 5-6 (
table(...)): tiga variabel menjadi tiga kolom;'VariableNames'berisi cell berisi nama dalam urutan yang sama. disp(T): Command Window menampilkan tabel rapi — kolomNamabertanda{'...'}karena isinya cell array.
Row names — label baris, bukan data — ditambahkan lewat 'RowNames':
kode = {'K001'; 'K002'; 'K003'; 'K004'};
T2 = table(stok, harga, 'VariableNames', {'Stok', 'Harga'}, ...
'RowNames', kode);
T2('K002', :)Output yang Dihasilkan:
ans =
1×2 table
Stok Harga
____ ____
K002 200 8000Baris 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:
| Sintaks | Mengembalikan | Tipe hasil |
|---|---|---|
T.Harga | seluruh kolom | array 4×1 |
T.Harga(2:3) | potongan kolom | array 2×1 |
T{2, 'Harga'} | satu elemen | skalar |
T(1:2, {'Nama','Stok'}) | dua baris, dua kolom | table 2×2 |
T(T.Stok > 100, :) | baris yang lolos mask | table |
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:
Kolom Stok (dot) : class double, size 4x1
Elemen T{2,Harga} : 8000
Produk stok > 100 : 2 barisMekanismenya: 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.
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:
Total nilai inventori : Rp5360000
Setelah hapus Harga : 3 variabelMari kita bedah baris-baris kode di atas:
- Baris 1 (
T.Nilai = T.Harga .* T.Stok): operasi element-wise antar dua kolom menghasilkan kolom baru[1800000 1600000 960000 1000000]; total5.360.000rupiah tercetak darisum. - Baris 4-5 (salinan lalu hapus):
Tdisalin dulu keTtanpaHargasupaya tabel asli tetap utuh;widthturun 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.
Turut = sortrows(T, 'Stok', 'descend');
Turut(1:2, :)Output yang Dihasilkan:
ans =
2×4 table
Nama Stok Harga Nilai
_______ ____ ______ _________
{'Teh' } 200 8000 1600000
{'Kopi'} 120 15000 1800000Baris 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.
summary(T)Output yang Dihasilkan:
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+05Statistik 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.
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:
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:
innerjoin: Susu tidak punya pasangan diTleft, jadi lenyap; hasilnya diurutkan menurut keyNama— perilaku bawaaninnerjoin.outerjoin: semua baris dari kedua tabel hadir; baris Susu tidak ditemukan diTleftsehingga kolomStokdiisiNaN.'MergeKeys', true: keyNamadilebur menjadi satu kolom. Tanpa opsi ini,outerjoinmenampilkan dua kolom kunci terpisah (Nama_TleftdanNama_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:
A = table2array(T(:, {'Stok', 'Harga'})); % kembali ke matriks
C = table2cell(T(:, {'Nama', 'Stok'})); % kembali ke cell array
writetable(T, 'inventori.csv'); % ekspor CSVMekanismenya: 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.