BAB IV Fitur Dasar R IV.1. Manipulasi sederhana untuk bilangan dan vektor Vektor dan assignment R beroperasi pada suatu struktur data, contoh yang paling sederhana adalah vektor numerik, yakni suatu entitas tunggal yang terdiri dari koleksi terurut bilanganbilangan. Misalkan pembuatan vektor numerik x yang mempunyai enam bilangan 11.0, 16.2, 7.2, 1.3, 8.3, 3.6. Perintah yang digunakan pada prompt (>) R sebagai berikut: > x <− c(11.0, 16.2, 7.2, 1.3, 8.3) Perintah ini merupakan assignment dengan menggunakan fungsi c(), sedangkan assignment operator adalah ”<-” yang terdiri dari tanda kurang dari ”<” dan tanda minus ”-”. Assignment tersebut di atas dapat juga dilakukan dengan menggunakan fungsi assign(): > assign("x", c(11.0, 16.2, 7.2, 1.3, 8.3)) Fungsi assign() identik dengan operator “<-“. Selain operan x terletak di sebelah kiri, pada R operan x tersebut dapat terletak di sebelah kanan dan dengan menggunakan tanda assignment ”->” yang berlawanan dengan tanda assignment sebelumnya, seperti berikut ini: > c(11.0, 16.2, 7.2, 1.3, 8.3) −> x 22 Perintah berikut: > y <− c(x,0,x) > y [1] 11.0 16.2 7.2 1.3 8.3 0.0 11.0 16.2 7.2 1.3 8.3 akan meng-assign vektor y dengan panjang 11 elemen, yang merupakan penggabungan (concatanation) vektor x, angka 0 dan vektor x. Vektor Aritmatika Vektor dapat digunakan dalam ekspresi aritmatika, dimana operasi-operasi aritmatika dilakukan pada setiao elemen vector. Vektor-vektor pada suatu ekspresi aritmatika yang sama tidak harus memiliki panjang yang sama. Hasil perhitungan yang melibatkan beberapa vektor dengan panjang yang berbeda akan menghasilkan vektor dengan panjang yang sesuai dengan vektor yang terpanjang dalam ekspresi tersebut. Pada vektor yang lebih pendek elemen akan diulang dari elemen terdepan hingga panjang vemtor tersebut sama dengan vektor yang terpanjang, begitupun dengan konstanta. Sebagai contoh perhatikan perintah berikut: > v <− 2*x+y+1 > v [1] 34.0 49.6 22.6 4.9 25.9 23.0 44.4 31.6 10.8 18.9 31.3 Perintah tersebut di atas akan menghasilkan vektor v dengan panjang sesuai dengan panjang vektor y, yaitu 11. Dimana vektor x diulang sebanyak 11/5 (2.2) kali dan konstanta 1 diulang sebanyak 11/1 (11) kali. Beberapa operator aritmatik yang tersedia di R untuk operasi vektor adalah seperti pada tabel berikut: Tabel 4.1 Operator Aritmatik dalam R Operator Fungsi +, -, *, / , ^ Penjumlahan, pengurangan, perkalian, pembagian dan perpangkatan log, exp, sin, cos, tan, Logaritma basis 10, exponential, sinus, sqrt, mean, var cosinus, tangen, akar kuadrat, nilai ratarata dan varian min, max, range, length Nilai minimum, maksimum, ranah vektor, dan panjang vektor sum, prod Jumlah total elemen vektor dan product (perkalian) vektor Sebagai contoh, untuk menghitung dua nilai dalam sample, yakni mean dan variansi (var) dapat kita tuliskan formula sum(x)/length(x) untuk mean(x) dan sum((x-mean(x))^2)/(length(x)-1) untuk var(x) Fungsi sort(x) akan menghasilkan sebuah vektor yang berukuran sama dengan vector x dimana elemennya sudah terurut dengan urutan menaik; selain itu terdapat 23 fasilitas pengurutan lain yang fleksibel (lihat fungsi order() atau sort.list() yang menghasilkan suatu permutasi dalam pengurutan). > sort(x) [1] 1.3 7.2 8.3 11.0 16.2 > order(x) [1] 4 3 5 1 2 > sort.list(x) [1] 4 3 5 1 2 Catatan: fungsi max dan min memilih nilai terbesar dan terkecil dari input argumen. Fungsi parallel maksimum (pmax) dan parallel minimum (pmin) menghasilkan sebuah vector (yang panjangnya sama dengan vector yang terpanjang dari input argumen) dimana elemennya merupakan nilai terbesar (terkecil) diantara nilai elemen pada posisi yang sama dari vector-vektor input argument yang dibandingkan. Pada kebanyakan penggunaan, kita tidak perlu memperhatikan tipe data numeric vektor apakah integer, real atau bahkan kompleks. Pada dasarnya R akan menggunakan tipe data real dengan double precision untuk melakukan proses aritmatika (untuk bilangan kompleks menggunakan double procision complex). Perhitungan bilangan kompleks secara eksplisit menggunakan format bilangan kompleks tersebut. Sebagai contoh: > sqrt(-17) Warning message: In sqrt(-17) : NaNs produced Kesalahan disebabkan oleh tidak ada nilai untuk akar negatif, sehingga perlu dikonversi nilai -17 sebagai bilangan kompleks, yaitu -17 + 0i sehingga pencarian nilai akar -17 adalah: > sqrt(-17+0i) [1] 0+4.123106i yang menghasilkan bilangan kompleks Barisan R juga mempunyai sejumlah fasilitas untuk membangkitkan (generate) barisan bilangan. Fungsi yang digunakan adalah seq(). Sebagai contoh, untuk menuliskan suatu barisan dari 1 hingga 20, kita tidak perlu menuliskan satu persatu elemen ke dalam vektor, cukup menuliskan > seq (1, 20) atau > seq (from=1, to=20) akan menghasilkan [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 24 Keterangan: [1] pada sisi paling kiri mengartikan baris ke-1 dari hasil perhitungan di R > seq (20, 1) Perintah tersebut akan menghasilkan barisan bilangan yang menurun dari 20 ke 1 Barisan bilangan juga dapat dibangkitkan dengan cacah kelipatan tertentu. Misalkan: > s3 <- seq(from=-5, to=5, by=.5) atau > s3 <- seq(-5,5,by.5) atau > s3 <- seq(length=21,from-5,by=.5) Ketiga perintah diatas menghasilkan keluaran yang sama. Argumen length menyatakan panjang vektor. > s3 [1] -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 1.5 2.0 [16] 2.5 3.0 3.5 4.0 4.5 5.0 0.0 0.5 1.0 Pembangkitan barisan bilangan yang elemennya merupakan pengulangan dapat dilakukan dengan menggunakan fungsi rep(), misalkan: > s4 <- rep(x,times=5) [1] 11.0 16.2 7.2 1.3 16.2 7.2 1.3 8.3 [16] 11.0 16.2 7.2 1.3 8.3 11.0 16.2 7.2 8.3 11.0 16.2 7.2 1.3 1.3 8.3 11.0 8.3 akan menyalin sebanyak 5 kali angka 4, sedangkan perintah berikut: > s5 <- rep(4,each = 5) [1] 11.0 11.0 11.0 11.0 11.0 16.2 16.2 16.2 16.2 16.2 7.2 7.2 [16] 1.3 1.3 1.3 1.3 1.3 8.3 8.3 8.3 8.3 8.3 7.2 7.2 7.2 akan menyalin setiap elemen x sebanyak 5 kali. Vektor Logika Seperti halnya vektor numerik, R juga menyediakan fasilitas untuk memanipulasi nilai logika. Elemen dari suatu vektor logika dapat bernilai Boolean (TRUE atau FALSE) atau NA (untuk ”not available” (tidak tersedia)). TRUE dan FALSE masingmasing biasa disingkat T dan F. Dalam hal ini T dan F hanyalah sebagai variabel yang di set nilainya ke TRUE dan FALSE secara defaultnya, tetapi bukan merupakan reserved word, sehingga dapat digunakan sebagai variabel dengan tipe lainnya. Vektor logika dibangkitkan dengan menggunakan perintah kondisi, seperti: > temp <- x < 13 25 akan menghasilkan suatu vektor yang panjangnya sam dengan vektor x dimana nilai elemennya merupakan nilai BOOLEAN dari hasil perbandingan nilai setiap elemen di x, dimana jika nilai elemen x < 13 maka bernilai TRUE selain itu bernilai FALSE. Sehingga nilai vektor temp adalah: > temp [1] FALSE TRUE FALSE FALSE FALSE Operator logika yang ada di R adalah <, <=, >, >=, == untuk persamaan eksak dan != untuk pertidaksamaan. Jika c1 dan c2 adalah ekspresi logika, maka c1&c2 adalah irisan keduanya, c1|c2 adalah gabungan keduanya dan !c1 adalah negasi(atau ingkaran) dari c1 Vektor logika dapat digunakan pada operator aritmatik, dimana nilai FALSE dinyatakan sebagai 0 dan TRUE sebagai 1. Tetapi juga vektor logika dengan nilai numeriknya tidak ekivalen. Missing value Dalam beberapa kasus dijumpai adanya komponen yang tidak lengkap dari suatu vektor. Nilai atau elemennya menjadi “not available” atau “missing value”, dan untuk alasan statistika, biasanya digantikan dengan nilai khusus NA. Umumnya dalam setiap operasi NA akan menjadi NA. Motivasinya adalah, jika spesifikasi suatu operasi tidak lengkap, maka hasilnya tidak diketahui dan oleh karenanya menjadi “not available”. Sebagai contoh, fungsi is.na(x) memberikan vektor logika yang mempunyai panjang yang sama dengan x dengan nilai TRUE jika dan hanya jika elemen yang berkorespondensi dalam x adalah NA. > z <- c(1:3,NA); ind <- is.na(z) > z [1] 1 2 3 NA > ind [1] FALSE FALSE FALSE TRUE Maksud dari hasil diatas, pertama mendefinisikan vektor c dengan elemen vector 1, 2, 3, NA. Kemudian membentuk vector ind berupa nilai logika dari setiap elemen c dengan kondisi is.na(z), yaitu apabila elemen di c berupa NA maka bernilai TRUE, selain itu bernilai FALSE. Terkadang pada operasi perhitungan juga akan dijumpai hasil NaN (Not a Number) untuk kalkulasi yang tidak mempunyai nilai, misal > 0/0 [1] NaN > Inf – Inf [1] NaN (Ket: Inf = Infinity (tak berhingga ∞). 26 Vektor karakter Vektor ini sering digunakan dalam R, misalkan dalam memberikan label suatu plot. Vektor ini menggunakan tanda petik dua (“) atau tanda petik satu (‘) untuk string karakter, dan biasanya di print dalam petik dua (“) (kadang tanpa tanda petik). Sebagai contoh > labs <- paste(c("X","Y"), 1:10, sep="") menghasilkan vektor karakter labs [1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10" IV.2. Objek dan Atribut Entitas dalam R dikenal sebagai objek. Vektor logika, vektor numeric, vektor karakter adalah suatu objek. Operasi pada objek harus mempunyai mode (atau sifat/property) objek yang sama, tanpa kesamaan tersebut maka operasi akan mengalami kesalahan (error). Singkatnya, nilai vektor semuanya harus mempunyai mode yang sama. Atribut (attribute) Fungsi attribute(object) menampilkan/mendapatkan daftar semua atribut non-instrinsik yang didefinisikan untuk suatu objek. Fungsi attr(object, name) dapat digunakan untuk memilih suatu atribut tertentu. Sebagai contoh > attr(z, "dim") <- c(10,10) mendefiniskan bahwa z memiliki mode sebagai matriks berukuran 10 x 10. Kelas (class) Objek Semua objek di R mempunyai kelas, dengan menggunakan fungsi class(). Kelas objek yang merupakan atribut spesial digunakan dalam pemrograman berorientasi object di R. Sebagai contoh, suatu objek dengan kelas “data.frame”, akan ditampilkan (di print) dengan cara tertentu. fungsi plot() akan menampilkan grafik dalam cara tertentu. Secara umum, suatu kelas objek mempunyai tampilan yang berbeda-beda. Untuk menghilangkan sementara efek dari kelas, maka dapat digunakan fungsi unclass(). Sebagai contoh, jika notebook berkelas “data.frame” maka > notebook akan dicetak dalam bentuk data frame, yang mirip dengan tampilan matriks, dimana > class(notebook) akan dicetak dalam bentuk daftar (list) biasa. 27 IV.3. Faktor terurut dan tidak terurut Suatu faktor adalah objek vektor yang digunakan untuk menspesifikasikan pengelompokan (grouping) diskrit komponen-komponen vektor lain yang mempunyai panjang yang sama. R menyediakan fasilitas untuk factor baik terurut maupun factor tidak terurut. Sebagai contoh, misalkan terdapat sample 15 akuntan pajak dari beberapa provinsi di pulau jawa, yaitu: 1 dari Banten (btn), 4 dari Jakarta (jkt), 3 dari Jawa Barat (jabar), 3 dari Jawa Tengah (jateng), 2 dari Yogyakarta (diy) dan 2 dari Jawa Timur (jatim). Vektor akuntan dinyatakan sebagai berikut: > prov <- c("btn", "btn", "btn", "dki", "dki","dki", "dki", "jabar", "jabar", "jabar", "jateng", "jateng", "jateng", "diy","diy", "jatim", "jatim") Suatu faktor dibuat dengan menggunakan fungsi factor() > provf <- factor(prov) Fungsi print() menangani factor dengan cara yang sedikit berbeda dari objek lain: > provf [1] btn btn [11] jateng btn dki dki dki dki jabar jabar jateng jateng diy diy jatim Levels: btn diy dki jabar jateng jatim jabar jatim Untuk menentukan level suatu vektor, gunakan fungsi level() > levels(provf) [[1] "btn" "diy" "dki" "jabar" "jateng" "jatim" Fungsi tapply() Melanjutkan contoh sebelumnya, setiap akuntan memiliki pendapatan yang dinyatakan dalam suatu vector yang berbeda, yaitu vector incomes. > incomes <- c(50, 82, 75, 80, 60, 61, 64, 60, 60, 75, 89, 96, 68, 89, 96, 93, 78) Untuk menghitung nilai mean sample pendapatan untuk setiap provinsi, kita gunakan fungsi tapply(): > incmeans <- tapply(incomes, provf, mean); > incmeans akan memberikan mean vektor untuk setiap provinsi btn diy dki jabar jateng jatim 69.00000 92.50000 66.25000 65.00000 84.33333 85.50000 28 Selain itu kita juga dapat mendefinisikan fungsi sendiri di R. Seperti berikut ini merupakan pendefinisian fungsi standard error (stderr): > stderr <- function(x) sqrt(var(x)/length(x)) dimana var(x) adalah variansi sample. Selanjutnya, standar error untuk masing-masing prov dituliskan sebagai berikut: > incster <- tapply(incomes, provf, stderr) > incster btn diy dki jabar jateng jatim 9.712535 3.500000 4.661455 5.000000 8.412953 7.500000 Faktor terurut Level-level dari faktor-faktor disimpan secara terurut alfabetis, atau dalam urutan dimana faktor dispesifikasikan secara eksplisit. Terkadang level akan memiliki suatu urutan yang sesuai dengan yang diinginkan untuk merekam data yang kemudian digunakan untuk analisis statistik. Fungsi ordered() membentuk factor terurut tetapi identik dengan fungsi faktor(). Pada kebanyakan penggunaan, yang hanya menjadi perbedaan antara faktor terurut dengan tidak terurut adalah pembentukan urutan level. Tetapi hal ini berbeda dengan pembentukan dalam model pencocokan linear. IV.4. Matriks dan Array IV.4.1 Array Suatu array adalah koleksi beragam model subscript data entri, misalkan numerik. R memiliki fasilitas untuk pembuatan dan penanganan array, dan khususnya matriks. Dimensi vektor adalah vektor bilangan bulat non-negatif. Jika panjang vektor tersebut k maka array merupakan berdimensi k. Sebagai contoh, matrik adalah array berdimensi 2. Dimensi adalah indeks dari satu hingga nilau yang diberikan dalam dimensi vektor. Suatu vektor dapat digunakan di R sebagai suatu array jika hanya memiliki dimensi sama dengan atribut dim nya. Misalkan suatu vektor z merupakan vektor yang terdiri dari 1500 elemen. Perintah > dim(z) <- c(3,5,100) Memberikan ke vektor nilai atribut dim yang menyatakan vektor tersebut merupakan array dengan dimensi 3x5x100. R memiliki fungsi yang dapat mempermudah penulisan vektor yakni matrix() dan array(). Contoh, jika array berdimensi vektor c(3, 4, 3) maka array tersebut mempunyai 3 x 4 x 3 =36 elemen. 29 IV.4.2 Indeks matriks Suatu matriks dapat digunakan dengan indeks tunggal untuk memberukan nilai untuk koleksi elemen yang tidak beraturan dalam array tersebut, atau untuk mengekstraksi koleksi yang tidak beraturan sebagai suatu vektor. Contoh yang jelas adalah suatu matriks. Dalam hal indeks ganda suatu array, suatu indeks matriks dapat terdiri dari dua kolom dan banyak baris sesuai dengan yang diinginkan. Entri dalam indeks matriks adalah indeks baris dan kolom untuk array berindeks ganda. Misalkan kita memilik array X berdimensi 4x5 dan untuk mendapatkan array X tersebut dapat melakukan hal sebagai berikut: − Ekstrak elemen X[1,3], X[2,2] dan X[3,1] sebagai suatu struktur vektor, dan − Menggantikan entri-entri pada indeks tersebut dengan 0 dalam array X Dalam kasus ini, diperlukan suatu array bersubscript 3x2 seperti contoh berikut ini: > x <- array(1:20, dim=c(4,5)) Perintah tersebut akan membentuk array berukuran 4 x 5 > x [1,] [2,] [3,] [4,] [,1] [,2] [,3] [,4] [,5] 1 5 9 13 17 2 6 10 14 18 3 7 11 15 19 4 8 12 16 20 > i <- array(c(1:3,3:1), dim=c(3,2)) Perintah tersebut akan membentuk array berukuran 3x2 > i [1,] [2,] [3,] [,1] [,2] 1 3 2 2 3 1 > x[i] # Mengekstrak elemen-elemen tersebut [1] 9 6 3 > x[i] <- 0 perintah di atas mengganti elemen-elemen tersebut dengan nol > x [1,] [2,] [3,] [4,] [,1] 1 2 0 4 [,2] [,3] [,4] [,5] 5 0 13 17 0 10 14 18 7 11 15 19 8 12 16 20 30 Indeks negatif tidak diperbolehkan dalam indeks matriks. Nilai 0 dalam indeks matriks akan diabaikan, sedangkan nilai NA akan menghasilkan NA. IV.4.3 Fungsi array( ) Selain menggunakan atribut dim (dimension), sebuah vector dapat juga dibentuk dengan menggunakan fungsi array(), dengan bentuk umum sebagai berikut: > Z <- array(data_vector, dim_vector) Sebagai contoh, jika vektor h mempunyai 24 atau lebih sedikit elemen, maka dapat dituliskan dengan cara seperti berikut: >Z <- array(h, dim=c(3,4,2)) perintah tersebut akan membentuk array 3x4x2 di Z. Sedangkan jika ukuran h adalah tepat 24 elemen maka hasilnya sama dengan > dim(Z) <- c(3,4,2) However if h is shorter than 24, its values are recycled from the beginning again to make it up to size 24 Tetapi jika h lebih pendek dari 24, maka nilainya digunakan (diputar) kembali dari depan hingga ukurannya menjadi 24. Dalam hal indeks, dim(Z) menyatakan dimensi vector c(3,4,2) dan Z[1:24] menyatakan data vektor seperti h di atas, dan Z[] dengan subscript hampa atau Z tanpa subscript untuk menyatakan array keseluruhan sebagai array. IV.4.4 Outer product dari dua array Outer product merupakan salah satu operasi yang penting dalam array. Jika a dan b dua array numeric, outer product dari array tersebut adalah sebuah array dengan dimensi dan data dari array a dan b sesuai dengan ketentuan perkalian matriks. Operator outer product berbentuk %o% . Contoh: > ab <- a %o% b Sebagai alternative: > ab <- outer(a,b,”*”) Fungsi perkalian dapat digantikan oleh sembarang fungsi dengan dua variabel. Sebagai contoh jika akan menghitung fungsi f(x,y) = cos(y) = (1 + x2) pada grid nilai vektor sumbu x dan y di R, maka dapat dilakukan sebagai berikut: > f <- function(x, y) cos(y)/(1 + x^2) > z <- outer(x, y, f) 31 Secara khusus, outer product dua vector adalah array dengan subscript ganda (yaitu sebuah matriks dengan rang paling besar 1). Operator outer product bersifat non komutatif. Contoh: Perhitungan nilai determinan matriks berdigit tunggal berukuran 2x2. [a, b; c, d] dimana setiap elemen adalah integer non negative dalam range 0, 1, ;..., 9. Permasalahannya adalah bagaimana menghitung determinan ad-bc, dari semua kemungkinan matriks dalam bentuk yang ditentukan tersebut serta menunjukkan frekuensi kemunculan setiap nilai sebagai plot densitas tinggi (high density). Untuk mendapatkan probabilitas distribusi determinan jika setiap digit dipilih secara bebas dan acak secara uniform, maka digunakan fungsi outer() sebanyak dua kali seperti berikut: > d <- outer(0:9, 0:9) > fr <- table(outer(d, d, "-")) > plot(as.numeric(names(fr)), fr, type="h",xlab="Determinan", ylab="Frekuensi") Catatan: konversi dari atribut names dari table frekuensi fr ke numeric untuk mendapatkan range nilai determinan. Hasil dari perintah di atas adalah sebagai gambar plot berikut: Gambar 4.1: Plot densitas tinggi untuk frekuensi kemunculan matriks 32 IV.4.5 Array Transpose Fungsi aperm(a, perm) digunakan untuk permutasi array a. Argumen perm adalah permutasi bilangan bulat {1, ..., k}, dimana k adalah banyaknya subscripts dalam a. Hasil fungsi tersebut adalah array yang berukuran sama dengan a namun dengan dimensi yang sebelumya diberikan oleh perm[j] menjadi dimensi baru yakni dimensi ke j. Cara paling mudah, yakni dengan menganggap operasi tersebut sebagai transposisi matrik. Jika A adalah matrik, maka B (sebagai permutasi A) dituliskan sebagai beirkut: > B <- aperm(A, c(2,1)) adalah transpos A dan dapat juga ditulis > B <- t(A) IV.4.6 Fasilitas matriks Matriks merupakan array dengan dua subscript (baris dan kolom). Dalam bagian ini akan dijelaskan fasilitas matriks yakni operasi dan operator yang penting dalam matriks seperti perkalian matriks, persamaan linier, inverse matriks, nilai eigen dan vektor eigen, determinan dan dekomposisi nilai tunggal, least squares fitting and the dekomposisi QR. Perkalian matrik Jika A dan B adalah matrik, maka > A * B matrik dengan perkalian elemen (elemen product) dan dinyatakan sebagai: > A %*% B matrik dengan perkalian matriks (matrix product). Jika x adalah vektor, maka > x %*% A %*% x adalah bentuk kuadrat. Fungsi crossprod() membentuk “crossproducts”, yang berarti crossprod(x, y) adalah sama dengan t(x)%*% y. Dalam hal ini akan lebih efisien dalam penulisan. Fungsi diag() mempunyai arti yang tergantung pada argumennya. Untuk vektor v, maka diag(v), berarti s diagonal matrik v. Untuk matrik M, diag(M), berarti matrikx yang merupakan diagonal utama dari matrik M. Konvensi pengertian tersebut serupa juga dalam software Matlab. 33 Persamaan linier dan inverse matrik R mempunyai fasilitas untuk mencari pemecahan persamaan linier matriks dan invers matrik. Diberikan matrik A dan b , maka persamaan Ax = b dituliskan, > b <- A %*% x dengan vektor x adalah solusi sistem persamaan linier (spl). Solusi dari persamaan tersebut, dalam R ditulis: > solve(A,b) Dalam aljabar linier, secara formal x = A-1 b dimana A-1 menyatakan inverse A, yang dapat dihitung dengan solve(A) tetapi jarang digunakan. Secara nukerik, keduanya tidak efisien dan berpotensi tidak stabil untuk menghitung > x <- solve(A) %*% b daripada solve(A,b). Nilai eigen dan vektor eigen Dalam R, fungsi eigen(Sm) digunakan untuk menghitung nilai eigen dan vektor eigen suatu matrik simetris Sm. Hasil dari fungsi ini adalah daftar/list dua komponen dengan nama values (nilai eigen) dan vectors (vektor eigen). Penulisan dari vektor eigen adalah sebagai berikut: > ev <- eigen(Sm) dimana menunjukkan daftar objek ev. Maka ev$val adalah vektor dari nilai eigen matrik simeteris Sm dan ev$vec adalah matrik yang berkoresponden vektor eigen Jika kita hanya akan mencari nilai eigen, maka dapat tuliskan perintah sebagai berikut: > evals <- eigen(Sm)$values objek evals menunjukkan vektor dari nilai eigen dan komponen kedua (eigen vector) diabaikan. Jika dituliskan suatu perintah > eigen(Sm) Maka akan mencetak kedua komponen, values dan vectors. 34 Saran: Untuk matrik yang berukuran besar, lebih baik hindari perhitungan vektor eigen. Determinan dan dekomposisi nilai tunggal Jika M adalah matriks kuadrat, maka fungsi > absdetM <- prod(svd(M)$d) menyatakan perhitung nilai mutlak (absolute) determinan M. Untuk menghitung dekomposisi nilai tunggal, dapat menggunakan fungsi svd(M), dimana M adalah matrik sembarang, u adalah kolom matrik orthogonal dan d matrik diagonal yang semuanyabernilai positif. Fungsi lsfit() akan mengahsilkan prosedur least squares. Penulisannya adalah > ans <- lsfit(X, y) Berikut merupakan contoh untuk menghitung dekomposisi QR, dengan menggunakan fungsi qr() > > > > Xplus <- qr(X) b <- qr.coef(Xplus, y) fit <- qr.fitted(Xplus, y) res <- qr.resid(Xplus, y) akan menghitung proyeksi orthogonal y pada range X, fit menunjukkan proyeksi pada orthogonal komplemen dan b sebagai vektor koefisien untuk proyeksi. Dalam hal ini, tidak diasumsikan bahwa X mempunyai rank kolom yang lengkap. Masalah redudansi akan ditemukan dan dihilangkan pada saat terdeteksi. IV.4.7 Pembentukan matrik partisi (forming partitioned matrices), cbind() dan rbind() Fungsi bind() dalam cbind() dan rbind() mempunyai arti mengikat/menyatukan. Lengkapnya cbind() berarti membentuk matrik dengan menyatukan/mengikat matrik-matrik secara baris (horizontal) atau/terhadap kolom (vertikal) dan rbind() menyatukan/mengikat matrik-matrik secara kolom atau/terhadap baris. Bentuk penulisannya adalah sebagai berikut: > X <- cbind(arg_1, arg_2, arg_3, ...) dimana argumen-argumennya dalam bentuk vektor, atau matrik yang kolomnya berukuran sama. Sama halnya dalam penulisan rbind(), argument-argumennya dalam bentuk vektor, atau matrik yang barisnya berukuran sama. 35 Misal X1 dan X2 mempunyai baris dengan jumlah yang sama. Untuk mengkombinasikannya terhadapa kolom ke dalam matrik x, maka dituliskan > X <- cbind(1, X1, X2) Hasil cbind() dan rbind() adalah matrik. Oleh karena itu cbind() dan rbind()adalah cara yang paling mudah untuk memperlakukan vektor x sebagai matriks baris atau matrik kolom. IV.4.8 Tabel frekuensi dari suatu faktor Perlu diingat kembali, karena faktor mendefinisikan suatu partisi ke dalam bentuk kelompok (grup), maka secara similar faktor juga mendefinisikan klasifikasi silang dua arah, dan seterusnya. Fungsi table() digunakan untuk menghitung tabel frekuensi dari faktor dengan panjang yang sama. Jika terdapat k faktor argument, akan menghasilkan frekuensi berbentuk array yang berukuran k (k –arah). Sebagai contoh, anggap, dengan menggunakan contoh pada data mengenai provinsi di pulau jawa, faktor provf akan mengatur menjadi kode-kode untuk setiap provinsi. Penulisan pernyataan ini adalah: > provfr <- table(provf) memebentuk provfr sebagai table frekuensi setiap provinsi (prov) dalam sample dengan output seperti berikut: btn 3 diy 2 dki 4 jabar jateng 3 3 jatim 2 Frekuensi akan diurutkan dan diberi label dengan atribut level suatu faktor. Penulisannya sebagai berikut: > provfr <- tapply(provf, provf, length) Anggap, incomef adalah faktor yang membentuk “bagian/ kelas dari pendapatan (income)” untuk setiap entri dalam data, sebagai contoh kita dapat menggunakan fungsi cut() > factor(cut(incomes, breaks = 35+10*(0:7))) -> incomef Dan untuk membentuk table frekuensi dua arah, kita tuliskan: > table(incomef,provf) provf incomef btn diy dki jabar jateng jatim (45,55] 1 0 0 0 0 0 (55,65] 0 0 3 2 0 0 (65,75] 1 0 0 1 1 0 (75,85] 1 0 1 0 0 1 (85,95] 0 1 0 0 1 1 (95,105] 0 1 0 0 1 0 36 IV.5. List dan Frame Data List (daftar) dalam R adalah objek yang terdiri dari koleksi terurut suatu objek yang disebut sebagai komponen. Suatu komponen dalam list tidak harus berjenis atau mode yang sama. Sebagai contoh, suatu list dapat terdiri dari vektor numerik, nilai logika, matriks, vektor komplek, array karakter, fungsi, dan lain lain. Penulisan berikut adalah contoh membuat suatu list: > Lst <- list(name="Fred", wife="Mary", no.children=3, child.ages = c(4,7,9)) > Lst $name [1] "Fred" $wife [1] "Mary" $no.children [1] 3 $child.ages [1] 4 7 9 List (daftar) baru dapat dibentuk dari objek yang sudah ada dengan menggunakan fungsi list(). Cara penulisannya adalah sebagai berikut: > Lst <- list(name_1=object_1, ...,name_m=object_m) Akan membentuk list Lst dengan m komponen dan menggunakan object_1, ..., object_m serta memberikan nama masing-masing dengan argument names. Jika nama dihilangkan , komponennya hanya berupa bilangan. Suat list, dapat diperluas dengan menambahkan komponen-komponen tambahan. Sebagai contoh > Lst[5] <- list(matrix=Mat); Lst[5] Frame Data (data frame) Frame Data adalah list dengan kelas “data.frame”. Sebagai catatan, ada emapat hal pembatasan suatu list diubah menjadi data frame, yakni: − Komponennya harus berupa vektor (numeric, karakter atau logika), faktor, matriks numeric, list, atau data frame lainnya. − Matriks, list, dan data frame menyediakan banyak variable untuk data frame sebanyak kolom, elemen atau variable yang dimiliki/didefinisikan sebelumnya. 37 − Struktur vektor yang ditampilkan dalam bentuk variable suatu data frame harus memiliki panjang yang sama, struktur matriknya harus mempunyai ukuran baris yang sama. Dalam praktiknya, data frame sering digunakan dalam bentuk matriks. Membuat Data Frame Fungsi yang digunakan untuk membuat data frame adalah data.frame. Seperti contoh berikut: > akuntan <- data.frame(home=provf, loot=incomes, shot=incomef) akan membentuk objek akuntan sebagai suatu data frame. Fungsi attach( ) dan detach( ) Fungsi attach() digunakan untuk memepermudah penulisan dalam list dan data frame, seperti penggunaan notasi $ pada penulisan akuntan$provf . Misal, anggap lentils terdiri tiga variable lentils$u, lentils$v, lentils$w. Maka penulisan > attach(lentils) akan menempatkan data frame kedalam jalur pencarian pada posisi 2, dan menyatakan bahwa tidak ada variable u, v atau w pada posisi 1. u, v dan w adalah variable dari frame dalam bentuk awal yang sudah ditentukan sebelumnya. Dalam hal ini, penulisan > u <- v+w tidak menggantikan komponen u dari data frame, namun hanya menutupinya dengan variable u lainnya dalam direktori kerja (working directory) pada posisi 1 pada jalur pencarian. Sedangkan untuk membuat perubahan atau pergantian suatu data frame yang permanent, cara yang sederhana yang dapat dilakukan dengan mengurutkan ulang (resort) pada notasi $: > lentils$u <- v+w Namun bagaimanapun, nilai baru suatu komponen u tidak tampak (visible) sampai data frame di-detach dan di-attach lagi. Untuk men-detach-nya dengan menuliskan fungsi > detach() 38 Sebagai contoh, untuk men-detach data frame lentils, dengan menuliskan > detach(lentils) Bekerja dengan data frame Berikut adalah cara bekerja dengan data frame dalam direktori kerja yang sama: − − − Kumpulkan secara bersamaan semua variable dari setiap permasalahan yang telah didefinisikan dan terpisah dalam data frame dengan nama informative yang sesuai Ketika mengerjakan/memproses suatu permasalahan, attach data frame yang bersangkutan pada posisi 2, dan gunakan direkori kerja pada level 1 untuk kuantitas operasional dan variable sementara/temporer; Sebelum keluar dari suatu permasalahan, tambahkan sebarang variable yang ingin anda simpan untuk referensi kerja selanjutnya dengan menggunakan assignment $ dan kemudian detach(); Catatan: lebih mudah apabila bekerja dalam direktori yang sama. IV.6. Membaca Data Suatu File Suatu objek data yang berukuran besar, biasanya dibaca sebagai nilai dari file eksternal (selain dari data R yang sedang kita kerjakan). Fasilitas input data di R, sangat mudah , sebgai contoh fungsi scan() yang dapat langsung kita panggil (fungsi scan(), fungsi yang primitive), sedangkan untuk data yang besar, dengan menggunakan fungsi read.table(). Fungsi read.table() Untuk langsung membaca data frame dari suatu file eksternal yang normalnya mempunyai bentuk khusus: • Baris pertama file terdiri dari nama setiap variabel dalam data frame • Setiap penambahan baris pada suatu file mempunyai label baris dan nilai untuk setiap variable pada baris pertama. Jika suatu file mempunyai item yang lebih sedikit pada baris pertamanya dibanding baris kedua, harus dilakukan suatu perubahan. Maka dalam baris pertama yang lebih sedikit akan dibaca sebagai data frame yang terlihat pada tabel berikut ini: 39 Input file form with names and row labels: 01 02 03 04 05 Price 52.00 54.75 57.50 57.50 59.75 Floor 111.0 128.0 101.0 131.0 93.0 Area 830 710 1000 690 900 Rooms 5 5 5 6 5 Age 6.2 7.5 4.2 8.8 1.9 Cent.heat no no no no yes Ket: 01,02,03,04,05, ….. adalah label untuk setiap baris dalam data frame Dengan item numerik yang sudah ditetapkan secara default (kecuali label baris) akan dibaca sebagai variabel numerik dan variabel non numerik, seperti pada Cent.heat yang dianggap sebagai factor, dan jika diperlukan, hal tersebut dapat diubah. Fungsi read.table() digunakan untuk membaca data frame secara langsung: > HargaRumah <- read.table("rumah.data") Kita juga dapat menghilangkan label baris untuk data frame dengan menuliskan > HargaRumah <- read.table("rumah.data",header=TRUE) header=TRUE digunakan untuk mengatur tabel data frame dalam bentuk default, sehingga label baris tidak akaan tampak, seperti dalam tabel berikut: Input file form with names and row labels: Price Floor Area Rooms Age 52.00 111.0 830 5 6.2 54.75 128.0 710 5 7.5 57.50 101.0 1000 5 4.2 57.50 131.0 690 6 8.8 59.75 93.0 900 5 1.9 Cent.heat no no no no yes Fungsi scan() Apabila akan membaca beberapa vektor data dengan panjang yang sama secara parallel (anggap ada tiga vektor, yang pertama dalam bentuk karakter dan sisanya dalam bentuk numeric, dan filenya adalah input.dat), maka pertama dapat menggunakan fungsi scan() untuk membaca ketiga vektor dalam bentuk list, dengan menuliskan: > inp <- scan("input.dat", list("",0,0)) Pada fungsi scan tersebut, argumen kedua adalah struktur list dummy, yang menetapkan mode ketiga vektor dapat dibaca. Hasilnya adalah objek inp yang 40 merupakan list yang komponennya adalah ketiga vektor tersebut. Untuk memisahkan item data menjadii tiga vektor terpisah, kita tuliskan: > label <- inp[[1]]; x <- inp[[2]]; y <- inp[[3]] Kita juga dapat memberikan nama komponen pada daftar dummy, (dalam kasus ini) digunakan untuk mengakses vektor yang ada di dalamnya. Sebagai contoh: > inp <- scan("input.dat", list(id="", x=0, y=0)) Jika anda ingin mengakses variabel secara terpisah, hal itu dapat dilakukan dengan re-assign variabel pada data frame, kita tuliskan: > label <- inp$id; x <- inp$x; y <- inp$y Jika argument kedua merupakan nilai tunggal atau tidak ada dalam list, maka semua komponen dalam vektor harus mempunyai mode yang sama sebagai nilai dummy. > X <- matrix(scan("light.dat", 0), ncol=5, byrow=TRUE) Mengakses dan menggunakan data yang built-in di R. Ketika anda meng-instal R, maka anda mempunyai sekitar 100 kumpulan data sebagai contoh atau latihan ( dalam paket dataset) . Untuk melihat kumpulan data tersebut, tuliskan: > data() akan tampak Gambar 4.2 berikut: 41 Gambar 4.2: Dataset default dalam R untuk melihat kumpulan data lengkap, maximize-kan window menjadi gambar berikut: 42 Gambar 4.3: Daftar dataset dalam R Untuk menggunakan salah satu data built-in anda dapat menggunakan fungsi data(). Sebagai contoh, untuk menggunakan data AirPassengers, tuliskan: > data(AirPassengers) dan untuk melihat item datanya, tuliskan > list(AirPassengers) [[1]] Jan Feb Mar Apr 1949 112 118 132 129 1950 115 126 141 135 1951 145 150 178 163 1952 171 180 193 181 1953 196 196 236 235 1954 204 188 235 227 1955 242 233 267 269 1956 284 277 317 313 1957 315 301 356 348 1958 340 318 362 348 1959 360 342 406 396 1960 417 391 419 461 May 121 125 172 183 229 234 270 318 355 363 420 472 Jun 135 149 178 218 243 264 315 374 422 435 472 535 Jul 148 170 199 230 264 302 364 413 465 491 548 622 Aug 148 170 199 242 272 293 347 405 467 505 559 606 Sep 136 158 184 209 237 259 312 355 404 404 463 508 Oct 119 133 162 191 211 229 274 306 347 359 407 461 Nov 104 114 146 172 180 203 237 271 305 310 362 390 Dec 118 140 166 194 201 229 278 306 336 337 405 432 43 Loading data dari paket R lainnya Selain dari dataset yang built-in, kita dapat menggunakan data dari paket R lainnya (dapt di download di website resmi R). Sebagai contoh: > data(package="rpart") > data(Puromycin, package="datasets") baris pertama akan memanggil (kumpulan) data dari paket rpart, pada baris kedua akan memanggil data Puromycin dari paket datasets. Menyunting/edit data Seperti software pengolahan & analisis data lainnya, R menyediakan fasilitas editor data mirip tampilan spreadsheet dengan menggunakan fungsi edit() yang penulisannya sebagai berikut: > xnew <- edit(xold) akan mengedit data sebelumnya xold menjadi data (objek) baru xnew. Sebagai contoh, dengan menggunakan data built-in pada dataset , yakni AirPassenger , penulisannya: > data(AirPassengers) > xnew<-edit(AirPassengers) menampilkan editor berikut: Gambar 4.4: Editor data AirPassenger Ket: Pemberian nama objek data yang diedit adalah bebas (bergantung kebutuhan dan kemudahan pengguna). 44 Untuk pengeditan data asli, dapat digunakan fungsi fix(). Misalkan: > xnew <- fix(xold) Ket: fungsi fix() ekivalen dengan fungsi edit() (pen.) Sebagai contoh, untuk mengganti data AirPassenger , dapat dilakukan dengan cara sebagai berikut: > xnew <- fix(AirPassengers) Sedangkan untuk melakukan pemasukan (input) data dengan menggunakan interface spreadsheet (seperti MS Excel), penulisannya sebagai berikut: > xnew <- edit(data.frame()) Sebagai contoh, akan digunakan data faithful untuk mengedit dengan model grid, dengan penulisan sebagai berikut: > attach(faithful) > xnew <-fix(faithful) Maka akan muncul spreadsheet sbb: Gambar 4.5: Spredsheet editor data 45 Pengeditan data dapat dilakukan dengan penulisan statement R seperti di atas, atau dengan menggunakan menu window: Edit -> Data editor …-> Masukan nama data (misal data faithful) -> OK untuk melanjutkan edit data. Tahapan tersebut ditunjukkan pada gambar berikut: Gambar 4.5: Menu Data editor pada menu utama Soal Latihan Bab IV 1. Tuliskan perintah dalam R yang menujukkan formula x2 + xy – 2/x . 2. Untuk menghasilkan barisan terurut meningkat keatas (ascending) mulai dari 1 sampai 100 dengan selisih 0,25, maka cara penulisan dalam R adalah? 3. Untuk membuat vektor dengan semua elemennya identik, misal angka 1 sebanyak 10 kali ( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) maka fungsi dari R yang digunakan adalah ? 4. Untuk membuat matrik kuadrat berukuran 2x2, dengan semua elemennya adalah 0, maka perintah R yang digunakan adalah ? 5. Jika A adalah sebuah matrik, dengan berukuran 2x3 dimana elemen secara terurut mulai array [1,1] = 1 , [2,1] = 2, …, [2,3] = 6. Maka perintah R yang digunakan untuk menuliskannya adalah ? 46 6. Jika K dan L adalah matrik kuadrat 2x2 dengan semua elemennya masing-masing adalah 1, dan 2. Untuk menggabungkan menjadi matrik berukuran 4x2 (ukuran 4 baris, 2 kolom) seperti matrik di bawah ini, diperlukan perintah R? 7. Dengan dua matrik yang sama pada soal no. 6, tuliskan perintah R yang menggabungkan keduanya menjadi matrik berukuran 2x4 . 8. Untuk matrik yang dihasilkan dari perhitungan soal no. 6 (misal matrik X) dan soal no. 7 (misal matrik Y), maka perintah R yang digunakan untuk mengalikan matrik X dan Y adalah ? 9. Lakukan perintah soal no. 8, namun untuk perkalian matrik Y dan X, lihat apakah ada perbedaan antara cara perkalian kedua matrik tersebut pada soal no. 8 dan soal no.9 ? 10. Misalkan, buka data sets yang terintegrasi pada R anda, kemudian edit lah data CO2 dan kemudian ganti menjadi objek dengan nama baru yakni karbondioksida, tuliskan perintah R yang digunakan! 47