Matriks menampung data yang seluruhnya berjenis angka, sedangkan data nyata hampir selalu memuat kolom label di samping kolom angka. Topik ini membahas tipe table, yaitu wadah data tabular dengan kolom bernama yang boleh berbeda tipe satu sama lain. Pembahasan mencakup pembuatan table, akses kolom lewat operator titik, ringkasan dengan summary dan head, pengurutan dengan sortrows, serta padanan lintas implementasi yang dibangun dari struct. Setelah membaca topik ini, data campuran nama stasiun dan suhu dapat disimpan dalam satu variabel yang tetap nyaman diolah secara kolom.
Konsep table untuk data campuran#
Tipe table menyimpan data dalam bentuk baris dan kolom seperti sebuah lembar kerja. Setiap kolom memiliki nama, dan setiap kolom menampung satu jenis data sendiri, misalnya teks untuk nama stasiun dan angka untuk suhu. Jumlah baris setiap kolom wajib sama sehingga tabel selalu berbentuk persegi panjang yang rapi. Nama kolom diambil dari nama variabel yang diberikan pada fungsi table, sehingga tidak perlu menamai kolom secara terpisah.
% tidak-dijalankan
% kolom teks berupa cell array, kolom angka berupa vektor kolom
stasiun = {'ruang'; 'ruang'; 'luar'; 'luar'; 'kolam'; 'kolam'};
suhu = [24.5; 24.8; 27.8; 27.5; 21.3; 21.1];
T = table(stasiun, suhu);Mengetik nama T pada Command Window menampilkan seluruh isi tabel dalam bentuk grid: kolom pertama bernama stasiun berisi teks, kolom kedua bernama suhu berisi angka, dan setiap baris mewakili satu pengukuran. Perbedaan mendasar dari matriks adalah keamanan tipe: penugasan teks ke kolom suhu ditolak karena bertentangan dengan jenis kolom yang sudah terbentuk, sedangkan matriks akan diam-diam mengubah seluruh kolom menjadi teks. Sifat inilah yang membuat table menjadi wadah standar untuk data hasil pengimporan berkas.
Mengakses kolom dengan operator titik#
Akses kolom memakai operator titik diikuti nama kolom, sebagaimana membaca bidang pada struct. Hasil dari T.suhu adalah vektor kolom berisi seluruh nilai suhu, sehingga fungsi agregat seperti mean dan max dapat langsung diterapkan padanya. Bentuk kedua memakai kurung kurawal dengan nama kolom di dalam tanda kutip, sedangkan pemotongan baris tetap memakai kurung siku seperti pengindeksan matriks.
% tidak-dijalankan
% seluruh kolom suhu sebagai vektor kolom
T.suhu
% cara kedua dengan nama kolom dalam tanda kutip
T{:, 'suhu'}
% dua baris pertama, seluruh kolom, sebagai table baru
T(1:2, :)Ketiga bentuk itu membagi tugas. Operator titik dan kurung kurawal menghasilkan data mentah berupa vektor yang siap dihitung, sedangkan kurung siku menghasilkan table baru yang mewarisi nama kolomnya. Karena itu ringkasan statistik dihitung lewat bentuk pertama, sedangkan penyaringan dan pembagian data menjadi subkelompok dikerjakan lewat bentuk ketiga. Nilai sel tunggal juga dapat dibaca dengan menggabungkan indeks baris dan nama kolom, misalnya T{3, 'suhu'} mengambil suhu pada baris ketiga. Pola akses yang sama berlaku pada penugasan, sehingga penggantian isi satu kolom cukup ditulis T.suhu = suhu_baru tanpa membangun ulang seluruh tabelnya.
Ringkasan dan pengurutan isi table#
Fungsi ringkasan pada table bekerja berdasarkan nama kolom. Fungsi summary menampilkan statistik tiap kolom, fungsi head dan tail mengambil sejumlah baris dari awal dan akhir tabel, dan fungsi sortrows mengurutkan baris berdasarkan satu kolom yang disebut namanya. Fungsi rowfun melengkapi kelompok ini dengan menerapkan sebuah fungsi pada setiap baris atau pada setiap kelompok baris, misalnya untuk menghitung rata-rata suhu per stasiun.
% tidak-dijalankan
% statistik ringkas untuk setiap kolom
summary(T)
% tiga baris pertama dan satu baris terakhir
head(T, 3)
tail(T, 1)
% urutkan baris berdasar kolom suhu, terkecil lebih dahulu
sortrows(T, 'suhu')
% rata-rata suhu untuk setiap stasiun
rata = rowfun(@mean, T, 'GroupingVariables', 'stasiun');Hasil summary untuk kolom suhu memuat nilai terkecil, terbesar, rata-rata, dan median beserta banyaknya baris, sedangkan untuk kolom stasiun berupa daftar nilai teks yang muncul beserta jumlah kemunculannya. Fungsi sortrows menghasilkan table baru dengan baris yang tersusun mengikuti kolom acuan, tanpa merusak kecocokan antara nama stasiun dan suhunya. Kecocokan seperti itu mustahil dijaga bila satu kolom matriks diurutkan secara terpisah. Perilaku serupa pada matriks memerlukan pengurutan indeks secara manual dengan [~, urutan] = sort(suhu) lalu pengindeksan ulang seluruh kolom.
Padanan lintas implementasi dengan struct#
Struct menyimpan nilai dalam bidang bernama dan menjadi padanan paling dekat untuk kolom bernama pada table. Satu struct memuat satu baris data: bidang nama menampung teks dan bidang suhu menampung angka pada wadah yang sama. Akses bidang memakai operator titik sehingga kodenya mirip dengan akses kolom pada table.
p = struct('nama', 'ruang', 'suhu', 24.5);
p.nama
p.suhuans = ruang
ans = 24.500Banyak baris ditampung oleh array struct, yaitu struct yang sama bidangnya namun berbeda isinya pada setiap indeks. Pembuatannya memakai cell array sebagai nilai pada fungsi struct: setiap elemen cell menjadi satu elemen array. Membaca bidang pada indeks tertentu dilakukan seperti pengindeksan array biasa, dan seluruh isi satu bidang dikumpulkan dengan kurung siku sehingga membentuk vektor yang setara dengan satu kolom table.
pengukuran = struct('nama', {'ruang', 'ruang', 'luar', 'luar', 'kolam', 'kolam'}, 'suhu', {24.5, 24.8, 27.8, 27.5, 21.3, 21.1});
pengukuran(2).suhu
[pengukuran.suhu]
fieldnames(pengukuran)ans = 24.800
ans =
24.500 24.800 27.800 27.500 21.300 21.100
ans =
{
[1,1] = nama
[2,1] = suhu
}Nilai pengukuran(2).suhu menunjukkan pengambilan satu baris, sedangkan [pengukuran.suhu] adalah cara mengumpulkan kolom suhu menjadi vektor baris yang siap dihitung. Fungsi fieldnames mendaftar seluruh nama bidang dan menjadi padanan daftar nama kolom pada table, berguna ketika nama bidang ditetapkan oleh data dan bukan oleh penulis skrip. Padanan ini tidak menandingi kenyamanan table untuk pembacaan dan pengurutan, tetapi kode yang memakai struct berjalan pada kedua implementasi tanpa penyesuaian.
Alur lengkap dengan array struct#
Skrip berikut merangkai seluruh alur: membentuk satu struct, membentuk array struct dari tiga stasiun, mendaftar nama bidang, lalu mengumpulkan kolom suhu untuk dihitung rata-rata dan nilai tertinggi. Struktur data tetap terdokumentasi lewat komentar karena nama bidang menjadi satu-satunya penanda kolom.
% data_sensor.m: menyimpan kolom bernama dengan struct lalu mengolahnya
% satu pengukuran sebagai struct dengan bidang bernama
p = struct('nama', 'ruang', 'suhu', 24.5);
fprintf('%s: %.1f derajat\n', p.nama, p.suhu);
% tiga pengukuran sebagai array struct
pengukuran = struct('nama', {'ruang', 'luar', 'kolam'}, 'suhu', {24.5, 27.8, 21.3});
% daftar seluruh nama bidang
daftar = fieldnames(pengukuran);
fprintf('bidang: %s, %s\n', daftar{1}, daftar{2});
% kumpulkan kolom suhu lalu ringkas
suhu_semua = [pengukuran.suhu];
fprintf('rata-rata suhu: %.2f derajat\n', mean(suhu_semua));
fprintf('suhu tertinggi: %.1f derajat\n', max(suhu_semua));ruang: 24.5 derajat
bidang: nama, suhu
rata-rata suhu: 24.53 derajat
suhu tertinggi: 27.8 derajatSkrip ini memperlihatkan batas padanan struct sekaligus alasannya. Pengumpulan kolom harus dikerjakan manual dengan [pengukuran.suhu] karena array struct tidak menyediakan ringkasan semacam summary, dan pengurutan berbasis bidang harus ditulis sendiri. Rata-rata 24,53 derajat merangkum ketiga stasiun sekaligus, sedangkan suhu tertinggi 27,8 derajat berasal dari stasiun luar, sehingga kedua angka itu membuktikan bahwa pengumpulan kolom benar-benar menjaring seluruh elemen array. Ketika seluruh alur berjalan pada MATLAB, migrasi dari struct ke table dapat dikerjakan bertahap karena pola aksesnya, yaitu operator titik dengan nama, sama pada keduanya.
Kesalahan umum#
- Jumlah baris kolom yang tidak sama. Fungsi table menolak kolom dengan panjang berbeda karena baris tabel harus sejajar. Cell array dari tiga nama yang dipasangkan dengan vektor kolom berisi dua suhu menggagalkan pembentukan tabel. Samakan jumlah baris lebih dahulu, atau isi nilai yang hilang secara eksplisit sebagai penanda data kosong.
- Nilai skalar yang tersebar diam-diam pada struct. Pemanggilan
struct('nama', {'ruang', 'luar'}, 'suhu', 24.5)menghasilkan dua elemen yang keduanya bernilai 24.5 karena nilai skalar disebarkan ke seluruh elemen array. Kesalahan ini tidak memicu error sehingga data yang salah dapat lolos sampai jauh ke dalam analisis. Bungkus setiap nilai kolom dalam cell array agar pasangan nama dan suhu selalu sejajar. - Menganggap
T.suhumenghasilkan table. Operator titik mengembalikan vektor kolom mentah, bukan table, sehingga fungsi ringkasan tabel seperti head tidak dapat diterapkan pada hasilnya. GunakanT(:, 'suhu')ketika keluaran yang dibutuhkan berupa table sebagian kolom yang mewarisi nama kolomnya.
Ringkasan#
- Tipe table menampung kolom bernama dengan tipe berbeda dan menjaga baris setiap kolom tetap sejajar.
- Akses kolom memakai
T.suhuatauT{:, 'suhu'}untuk data mentah, dan kurung siku untuk table baru hasil pemotongan baris. - Fungsi summary, head, tail, sortrows, dan rowfun bekerja berdasarkan nama kolom sehingga ringkasan dan pengurutan tidak merusak kecocokan antarbaris.
- Array struct dengan fieldnames menjadi padanan lintas implementasi: satu struct mewakili satu baris dan
[array.bidang]mengumpulkan satu kolom.
Referensi#
- table — MathWorks — Rujukan tipe table beserta pembuatan dan akses kolomnya.
- summary — MathWorks — Rujukan fungsi summary untuk menampilkan statistik kolom table.
- sortrows untuk table — MathWorks — Rujukan pengurutan baris table berdasarkan kolom.
- struct — MathWorks — Rujukan fungsi struct beserta perilaku penyebaran nilai skalar.
- fieldnames — MathWorks — Rujukan fungsi fieldnames untuk mendaftar bidang struct.