Dosen Pengampu : Prof. Dr. Suhartono, M.Kom
Lembaga : Universitas Islam Negeri Maulana Malik Ibrahim Malang
Jurusan : Teknik Informatika
Fakultas : Sains dan Teknologi
R umumnya memiliki 6 struktur data diantaranya :
1. Vektor
2. Skalar
3. Karakter String
4. Matriks
5. List
6. Classes
Struktur data ini merupakan struktur data yang paling banyak digunakan dalam R. Bisa dikatakan vektor merupakan struktur data yang utama dalam R. Vektor adalah kumpulan nilai yang disebut elemen, yang memiliki tipe data atau mode yang sama. Kita dapat membuat vektor dari elemen-elemen berjenis numerik, string, atau bilangan bulat.
Tipe Kelas di Object Vector
Character
Kelas object yang berisikan karakter dan string.
nama <- c("Dina", "Anton", "Lily")
class(nama)
## [1] "character"
Kelas object yang berisikan bilangan kompleks misalkan bilangan imaginer.
waktu <- c(2+3i, 8i, (2+1i)*2)
class(waktu)
## [1] "complex"
Kelas object yang berisikan segala jenis angka
tinggi_badan <- c(160, 164.5, 156.8)
class(tinggi_badan)
## [1] "numeric"
Kelas object yang berisikan bilangan integer (bilangan bulat)
jml_saudara <- c(3L,2L,4L)
class(jml_saudara)
## [1] "integer"
Kelas object yang berisikan nilai boolean yaitu TRUE atau FALSE
abc <- c(TRUE, FALSE, TRUE)
class(abc)
## [1] "logical"
Yang menjadi pertanyaan adalah bagaimana jika kita membangun sebuah vector namun menginputkan lebih dari 1 tipe kelas yang berbeda? Maka R akan membaca tipe kelas data berdasarkan tipe kelas dengan urutan tertinggi sesuai susunan berikut:
Character
Complex
Numeric
Integer
Logical
Contoh: Kita akan membuat suatu vektor dengan 3 tipe kelas yang berbeda, yaitu: Complex, Integer, dan Logical.
vektor1 <- c(5i, 7i, 6.7, 8, TRUE, FALSE)
vektor1
## [1] 0.0+5i 0.0+7i 6.7+0i 8.0+0i 1.0+0i 0.0+0i
class(vektor1)
## [1] "complex"
Dapat dilihat tipe kelas object “vektor1” merupakan complex karena tipe kelas complex berada di atas integer dan logical.
Membuat baris bilangan genap dari 2 hingga 20.
seq(2, 20, by=2)
## [1] 2 4 6 8 10 12 14 16 18 20
#Membuat angka 10 sebanyak 5
rep(10,5)
## [1] 10 10 10 10 10
#Membuat deret angka 1 sampai 5 sebanyak 3 kali
rep(1:5, 3)
## [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
#Membuat deret angka genap yang berada diantra 2 hingga 10 diulang sebanyak 3 kali.
rep(seq(2,10, by=2),3)
## [1] 2 4 6 8 10 2 4 6 8 10 2 4 6 8 10
#Membuat deret angka 1 muncul 1 kali, angka 2 muncul 2 kali, dan angka 3 muncul 3 kali.
rep(1:3,1:3)
## [1] 1 2 2 3 3 3
#Membuat deret angka 1 sampai 3 yang dimana setiap angka diulang 2 kali
rep(1:3,rep(2,3))
## [1] 1 1 2 2 3 3
rep(1:3,each=2)
## [1] 1 1 2 2 3 3
#Membuat karakter A1 sampai A10 dimana tidak ada pemisah antara A dan tiap angkanya.
paste("A",1:10,sep="")
## [1] "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" "A10"
paste0("A",1:10)
## [1] "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" "A10"
#Membuat karakter A-1 sampai A-10 dimana ada pemisah (-) antara A dan tiap angkanya.
paste("A",1:10,sep="-")
## [1] "A-1" "A-2" "A-3" "A-4" "A-5" "A-6" "A-7" "A-8" "A-9" "A-10"
Perhatikan perbedaan pola karakter jika menggunakan function ‘paste0’
paste0("A",1:10,sep="-")
## [1] "A1-" "A2-" "A3-" "A4-" "A5-" "A6-" "A7-" "A8-" "A9-" "A10-"
#Membuat pola karakter A1 sampai A3 dimana setiap karakter diulang 2 kali
paste0("A",rep(1:3,each=2))
## [1] "A1" "A1" "A2" "A2" "A3" "A3"
#Membuat sebuah vector terdiri dari 2 kata "la" dan "ye". Dengan urutan "la" "ye" "ye" "la" yang diulang sebanyak 4 kali
c("la","ye")[rep(c(1,2,2,1),times=4)]
## [1] "la" "ye" "ye" "la" "la" "ye" "ye" "la" "la" "ye" "ye" "la" "la" "ye" "ye"
## [16] "la"
#Membuat sebuah vector terdiri dari 2 kata "la" dan "ye". Setiap"la" dan "ye" masing-masing diulang 3 kali, kemudian dimunculkan 2 kali.
c("la","ye")[rep(rep(1:2,each=3),2)]
## [1] "la" "la" "la" "ye" "ye" "ye" "la" "la" "la" "ye" "ye" "ye"
vektor2 <- paste("A",1:12,sep="")
vektor2
## [1] "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" "A10" "A11" "A12"
#Melihat panjang elemen pada vektor2
length(vektor2)
## [1] 12
#Mengambil elemen ketiga dalam vektor2
vektor2[3]
## [1] "A3"
#Mengambil elemen ke 7 sampai 10 dalam vektor2
vektor2[7:10]
## [1] "A7" "A8" "A9" "A10"
#Mengambil elemen selain elemen ke 7 sampai 10 dalam vektor2
vektor2[-(7:10)]
## [1] "A1" "A2" "A3" "A4" "A5" "A6" "A11" "A12"
#Mengambil elemen 1, 3, dan 7 dari vektor2
vektor2[c(1,3,7)]
## [1] "A1" "A3" "A7"
#Mengambil elemen selain elemen 1, 3, dan 7 dari vektor2
vektor2[-c(1,3,7)]
## [1] "A2" "A4" "A5" "A6" "A8" "A9" "A10" "A11" "A12"
#Mengambil elemen dengan urutan genap dari vektor2
vektor2[(seq(2,12, by= 2))]
## [1] "A2" "A4" "A6" "A8" "A10" "A12"
#Mengambil elemen dengan urutan ganjil dari vektor2
vektor2[(seq(1,12, by= 2))]
## [1] "A1" "A3" "A5" "A7" "A9" "A11"
vektor2[-(seq(2,12, by= 2))]
## [1] "A1" "A3" "A5" "A7" "A9" "A11"
x1 <- paste(c("X","Y"),1:10,sep="")
#Membuat urutan bilangan dari 1:28 dengan selang 3 angka
x2 <- seq(1,28, by=3)
x2[3:4]
## [1] 7 10
Matrix atau array dua dimensi adalah struktur data yang memiliki row dan column, Unsur-unsur di dalam matriks semua harus memiliki tipe kelas data yang sama.
#Membuat matriks berisi angka 1 sampai 12 dengan elemen 3 baris dan 4 kolom
matrix(1:12,3,4)
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
matrix(1:12,3,4,byrow=TRUE)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
matrix(1:10,4,5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 3 7
## [2,] 2 6 10 4 8
## [3,] 3 7 1 5 9
## [4,] 4 8 2 6 10
vektor3 <- 1:12
vektor3
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
class(vektor3)
## [1] "integer"
dim(vektor3) <- c(6,2)
vektor3
## [,1] [,2]
## [1,] 1 7
## [2,] 2 8
## [3,] 3 9
## [4,] 4 10
## [5,] 5 11
## [6,] 6 12
typeof(vektor3)
## [1] "integer"
Function class
pada structur data vector mengeluarkan type kelas data seperti output diatas object vektor3 memiliki struktur data “matrix” dan “array”. Function class
pada selain structur data vector mengeluarkan type structur data. Pada contoh di atas structur data bisa matrix atau array (array 2 dimensi). Untuk mengeluarkan tipe kelas data pada structur mariks bisa menggunakan function typeof
.
is.matrix(vektor3)
## [1] TRUE
is.array(vektor3)
## [1] TRUE
#Membuat matriks dengan hanya menentukan banyaknya nrow (banyaknya baris) kemudian ncol(banyaknya kolom) akan menyesuaikan sesuai bilangan yang tersisa
matrix(1:6,2)
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
matrix(1:6,3)
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
matriks1 <- matrix(1:4,2)
matriks1
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
matriks2 <- matrix(6:9,2)
matriks2
## [,1] [,2]
## [1,] 6 8
## [2,] 7 9
matriks3 <- rbind(matriks1, matriks2)
matriks3
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
## [3,] 6 8
## [4,] 7 9
matriks4 <- cbind(matriks1, matriks2)
matriks4
## [,1] [,2] [,3] [,4]
## [1,] 1 3 6 8
## [2,] 2 4 7 9
dim(matriks4)
## [1] 2 4
length(matriks4)
## [1] 8
matriks5 <- matrix(1:8, 4,4)
matriks5
## [,1] [,2] [,3] [,4]
## [1,] 1 5 1 5
## [2,] 2 6 2 6
## [3,] 3 7 3 7
## [4,] 4 8 4 8
dim(matriks5)
## [1] 4 4
nama_matriks``[row, col]
#Mengakses elemen matriks5 yang berada di row ke 2 dan column ke 3
matriks5[2,3]
## [1] 2
#Mengakses elemen matriks5 yang berada di row ke 1 dan 3 dan semua column kecuali column ke 2.
matriks5
## [,1] [,2] [,3] [,4]
## [1,] 1 5 1 5
## [2,] 2 6 2 6
## [3,] 3 7 3 7
## [4,] 4 8 4 8
matriks5[c(1,3),-2]
## [,1] [,2] [,3]
## [1,] 1 1 5
## [2,] 3 3 7
matriks6a <- matrix(paste("A",1:12,sep=""), 4,3)
matriks6a
## [,1] [,2] [,3]
## [1,] "A1" "A5" "A9"
## [2,] "A2" "A6" "A10"
## [3,] "A3" "A7" "A11"
## [4,] "A4" "A8" "A12"
matriks6b <- matrix(paste("A",1:12,sep=""), 4,3, byrow = T)
matriks6b
## [,1] [,2] [,3]
## [1,] "A1" "A2" "A3"
## [2,] "A4" "A5" "A6"
## [3,] "A7" "A8" "A9"
## [4,] "A10" "A11" "A12"
## [,1] [,2] [,3]
#Mengakses elemen ketiga dari matriks6a dan matriks6b. PERHATIKAN PERBEDAANNYA
matriks6a[3]
## [1] "A3"
Array dalam Pemrograman R secara sederhana disebut sebagai struktur Data multi-dimensi. Array dasarnya sama seperti matrix namun array dapat mempunyai lebih dari dua dimensi.
LETTERS
kemudian diulangi sebanyak 3 kali (3 lapisan)array1 <- array(LETTERS,dim=c(2,2,3))
array1
## , , 1
##
## [,1] [,2]
## [1,] "A" "C"
## [2,] "B" "D"
##
## , , 2
##
## [,1] [,2]
## [1,] "E" "G"
## [2,] "F" "H"
##
## , , 3
##
## [,1] [,2]
## [1,] "I" "K"
## [2,] "J" "L"
array(c("A","B"),dim=c(2,1,2,3))
## , , 1, 1
##
## [,1]
## [1,] "A"
## [2,] "B"
##
## , , 2, 1
##
## [,1]
## [1,] "A"
## [2,] "B"
##
## , , 1, 2
##
## [,1]
## [1,] "A"
## [2,] "B"
##
## , , 2, 2
##
## [,1]
## [1,] "A"
## [2,] "B"
##
## , , 1, 3
##
## [,1]
## [1,] "A"
## [2,] "B"
##
## , , 2, 3
##
## [,1]
## [1,] "A"
## [2,] "B"
array(1:12,dim=c(3,4))
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
General Function object_array[baris, kolom, lembar, buku]
Mengakses lembar ke-1 dari object array1 : array1[,,1,]
Mengakses buku ke-2 dari object array1 : array1[,,,2]
Mengakses lembar ke-2 dan buku ke 3 dari object array1 : array1[,,2,3]
array1
## , , 1
##
## [,1] [,2]
## [1,] "A" "C"
## [2,] "B" "D"
##
## , , 2
##
## [,1] [,2]
## [1,] "E" "G"
## [2,] "F" "H"
##
## , , 3
##
## [,1] [,2]
## [1,] "I" "K"
## [2,] "J" "L"
array1[1,2,3]
## [1] "K"
Faktor adalah objek data yang digunakan untuk data kategori dan menyimpannya sebagai level. Factor dapat menyimpan string dan integer, factor berguna untuk suatu kolom yang memiliki nilai unik dalam jumlah terbatas. Misalkan “Pria,” Wanita" dan “Benar”, “Salah”, dsb.
Faktor dibangun dengan menggunakan function faktor()
dengan menggunakan vektor sebagai input.
#Membangun sebuah vektor kelas character
golongan_darah <- c("A", "A","B","O","AB","O")
golongan_darah
## [1] "A" "A" "B" "O" "AB" "O"
#Membangun struktur data factor dari yang semula vector
factor(golongan_darah)
## [1] A A B O AB O
## Levels: A AB B O
levels(factor(golongan_darah))
## [1] "A" "AB" "B" "O"
faktor_nominal <- factor(golongan_darah, levels = c("O","A","B","AB"))
faktor_nominal
## [1] A A B O AB O
## Levels: O A B AB
levels(factor(golongan_darah, levels = c("O","A","B","AB")))
## [1] "O" "A" "B" "AB"
tingkat_pendidikan <- c("SD","SMP","SMA")
faktor_ordinal <- factor(tingkat_pendidikan, levels=tingkat_pendidikan, ordered=TRUE)
faktor_ordinal
## [1] SD SMP SMA
## Levels: SD < SMP < SMA
factor(golongan_darah, levels = c("O","A","B","AB"), ordered=F)
## [1] A A B O AB O
## Levels: O A B AB
faktor_nominal[6]
## [1] O
## Levels: O A B AB
faktor_ordinal[3:4]
## [1] SMA <NA>
## Levels: SD < SMP < SMA
Mengambil elemen ke-3 dan 4 dari faktor_ordinal. Karena elemen dalam faktor_ordinal hanya ada 3 elemen, sehingga elemen ke-4 bernilai NA.
List adalah objek R yang memungkinkan elemen dari berbagai tipe kelas data seperti integer, character, logical dan lainnya. List juga dapat berisi matriks atau fungsi sebagai elemennya. List dibuat dengan menggunakan function list()
.
list1 <- list("man", "women", c(10,12,21), TRUE, FALSE, 119.1)
list1
## [[1]]
## [1] "man"
##
## [[2]]
## [1] "women"
##
## [[3]]
## [1] 10 12 21
##
## [[4]]
## [1] TRUE
##
## [[5]]
## [1] FALSE
##
## [[6]]
## [1] 119.1
class(list1)
## [1] "list"
#Mengeluarkan elemen ke 2 dan 3 dari list1
list1[2:3]
## [[1]]
## [1] "women"
##
## [[2]]
## [1] 10 12 21
#Mengeluarkan elemen ke-1 dari elemen ke-3 dari list1
list1[[3]][1]
## [1] 10
list2 <- list(vect=nama,mat=matriks1,array=array1,fac=faktor_ordinal)
list2
## $vect
## [1] "Dina" "Anton" "Lily"
##
## $mat
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $array
## , , 1
##
## [,1] [,2]
## [1,] "A" "C"
## [2,] "B" "D"
##
## , , 2
##
## [,1] [,2]
## [1,] "E" "G"
## [2,] "F" "H"
##
## , , 3
##
## [,1] [,2]
## [1,] "I" "K"
## [2,] "J" "L"
##
##
## $fac
## [1] SD SMP SMA
## Levels: SD < SMP < SMA
Data frame adalah struktur data dimana satu kolom harus memiliki tipe kelas yang sama, namun kolom yang berbeda dapat memiliki tipe kelas yang berbeda.
#Membuat data frame dari object sebelumnya yang sudah dibangun
df_1 <- data.frame(nama, tinggi_badan, jml_saudara, faktor_ordinal)
df_1
## nama tinggi_badan jml_saudara faktor_ordinal
## 1 Dina 160.0 3 SD
## 2 Anton 164.5 2 SMP
## 3 Lily 156.8 4 SMA
names(df_1)
## [1] "nama" "tinggi_badan" "jml_saudara" "faktor_ordinal"
str(df_1)
## 'data.frame': 3 obs. of 4 variables:
## $ nama : chr "Dina" "Anton" "Lily"
## $ tinggi_badan : num 160 164 157
## $ jml_saudara : int 3 2 4
## $ faktor_ordinal: Ord.factor w/ 3 levels "SD"<"SMP"<"SMA": 1 2 3
df_1$nama
## [1] "Dina" "Anton" "Lily"
df_1[2,2]
## [1] 164.5
Melihat apakah ada daftar dengan nama Lily
df_1$nama=="Lily"
## [1] FALSE FALSE TRUE
Nama Lily terdapat di daftar no.3
class(matriks1)
## [1] "matrix" "array"
is.array(matriks1)
## [1] TRUE
Seorang peneliti merancang sebuah perancangan percobaan RAKL dengan 4 perlakuan dan 3 kelompok (anggaplah respon percobaan berupa baris bilangan ganjil dari 1 hingga 23).
Perl <- paste0("P",rep(1:4,each=3))
Kel <- factor(rep(1:3,4))
Resp <- seq(1,23, by=2)
data1 <- data.frame(Perl, Kel, Resp)
data1
## Perl Kel Resp
## 1 P1 1 1
## 2 P1 2 3
## 3 P1 3 5
## 4 P2 1 7
## 5 P2 2 9
## 6 P2 3 11
## 7 P3 1 13
## 8 P3 2 15
## 9 P3 3 17
## 10 P4 1 19
## 11 P4 2 21
## 12 P4 3 23