Operasi dasar dan tipe variabel di R

2019/03/02

Operasi dasar

Software R dapat digunakan untuk menyelesaikan masalah dalam matematika misalnya penjumlahan, perkalian dan seterusnya. Penjumlahan dapat dilakukan dengan tanda operasi +, pengurangan adalah -, perkalian menggunakan *, dan pembagian berupa /. Berikut contohnya:

Penjumlahan:

1+1
## [1] 2

Pengurangan:

5-4
## [1] 1

Perkalian:

2*3
## [1] 6

Pembagian:

9/3
## [1] 3

Operasi yang lain misalnya:

Eksponen dengan menggunakan ^:

3^2
## [1] 9

Akar bilangan dengan menggunakan sqrt:

sqrt(16)
## [1] 4

Modulus (sisa nilai atas pembagian dengan bilangan tertentu) dengan menggunakan %%:

10%%5
## [1] 0
11%%5
## [1] 1
13%%5
## [1] 3

Penggunaan variabel

Varibel digunakan untuk menyimpan data. Nilai variabel dapat diubah-ubah sesuai kebutuhan pengguna. Variabel dalam R case-sensitif artinya penggunaan huruf besar dan kecil akan dianggap dua variable yang berbeda, a berbeda dengan A. Misalnya, barisan nilai dari 1 sampai dengan 10 disimpan di variabel a.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
a <- 1:10

Jika variabel a dicetak, maka akan muncul nilai dari 1 sampai dengan 10. Jika pengguna salah misalnya menuliskan A bukan a, maka kesalahan akan muncul karena bahasa R case-sensitive.

a
##  [1]  1  2  3  4  5  6  7  8  9 10
print(a)
##  [1]  1  2  3  4  5  6  7  8  9 10
> A
Error: object 'A' not found

Variabel yang telah dibuat dapat diganti nilainya. Nilai terakhir yang dimasukkan menjadi nilai dari variabel. Misalnya, variabel b awalnya adalah barisan nilai dari 11 sampai dengan 20 kemudian diganti dengan barisan nilai dari 5 sampai dengan 11. Nilai b berubah menjadi nilai terakhir yang dimasukkan. Jika variabel b digunakan nilai terakhir yang digunakan.

b <- 11:20
b
##  [1] 11 12 13 14 15 16 17 18 19 20
b <- 5:11
b
## [1]  5  6  7  8  9 10 11

Misalnya, variabel b dikalikan dengan 2, maka yang dikalikan adalah barisan nilai dari 5 sampai dengan 11 (nilai b terakhir), bukan barisan nilai 11 sampai dengan 20.

b*2
## [1] 10 12 14 16 18 20 22

Ada beberapa cara membuat variabel:

Menggunakan tanda <- atau ->

x <- c(1, 2, 3, 5, 7)
x
## [1] 1 2 3 5 7
c(4, 6, 8, 9) -> y
y
## [1] 4 6 8 9

Menggunakan assign

assign("z", c(1, 2, 3, 5, 7))
z
## [1] 1 2 3 5 7

Meskipun menggunakan = dapat digunakan untuk membuat variabel, tetapi tidak disarankan karena dapat membingungkan saat bekerja dengan operasi logical. Penulis lebih suka menggunakan tanda <- untuk membuat variabel.

p = c(1, 2, 3, 5, 7)
p
## [1] 1 2 3 5 7

Tipe data pada variabel

Setiap variabel memiliki tipe data yang selalu melekat (inherits). Beberapa tipe data (class) variabel antara lain:

Numeric:

d <- c(1)
d
## [1] 1
class(d)
## [1] "numeric"

Integer:

e <- as.integer(1)
e
## [1] 1
class(e)
## [1] "integer"

Character:

f <- letters[1]
f
## [1] "a"
class(f)
## [1] "character"

Logical:

g <- 1 < 5
g
## [1] TRUE
class(g)
## [1] "logical"

Factor:

h <- as.factor(rep(letters[1:3], 3))
h
## [1] a b c a b c a b c
## Levels: a b c
class(h)
## [1] "factor"

Struktur data

Vector

Vector dalam R sebanding dengan vektor baris secara matematis, artinya vector pada R hanya terdiri atas 1 baris dan banyak kolom. Variabel h pada contoh diatas adalah contoh dari factor vector.

h
## [1] a b c a b c a b c
## Levels: a b c
class(h)
## [1] "factor"

Matrix

Matrix dalam R sebanding dengan matriks secara matematis, artinya matrix pada R terdiri atas baris dan kolom. Ingat bahwa vektor baris sama dengan matriks dengan hanya 1 baris dan vektor kolom adalah matriks yang hanya memiliki satu kolom.

mat <- matrix(1.5:8.5, 2, 4)
mat
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
class(mat)
## [1] "matrix"

Nilai (class) elemen pada matrix hanya dapat berupa numeric, integer atau logical, sehingga matriks dapat berupa numerical matrix, integer matrix, logical matrix atau gabungan dari ketiga class tersebut.

Logical matrix:

matlog <- matrix(1:9 < 5, 3, 3)
matlog
##      [,1]  [,2]  [,3]
## [1,] TRUE  TRUE FALSE
## [2,] TRUE FALSE FALSE
## [3,] TRUE FALSE FALSE
class(matlog)
## [1] "matrix"

Mixed matrix:

matgab <- matrix(0, 3, 3)
matgab[1,] <- 1.5:3.5  #baris 1 adalah numerical
matgab[2,] <- 1:3  #baris 2 adalah integer
matgab[3,] <- 1:3 < 2  #baris 3 adalah logical
matgab
##      [,1] [,2] [,3]
## [1,]  1.5  2.5  3.5
## [2,]  1.0  2.0  3.0
## [3,]  1.0  0.0  0.0
class(matgab)
## [1] "matrix"

Array

Matrix dapat disebut dengan array dengan dimensi 2 (karena terdiri atas baris dan kolom), sehingga array pada R merupakan multidimensional matrix. Misalnya array dengan dimensi 2, 4, 3, dapat dibuat dengan cara:

arrayx <- array(1:3, dim = c(2,4,3))
arrayx
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    1    3    2    1
## [2,]    2    1    3    2
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    3    2    1    3
## [2,]    1    3    2    1
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    3    2
## [2,]    3    2    1    3
class(arrayx)
## [1] "array"

Seperti halnya dengan matrix, array hanya dapat diisi variabel dengan kelas numerical, integer, dan logical.

Data frame

Data frame dalam R sama dengan matriks secara format, artinya data frame pada R terdiri atas baris dan kolom. Perbedaan dengan matrix adalah elemen dari data frame dapat berupa character atau pun factor yang tidak akan pernah muncul pada matrix.

dat <- data.frame(x1 = a[-10], x2 = h)
dat
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
class(dat)
## [1] "data.frame"

Perhatikan bahwa variabel dat terdiri atas 9 baris dan 2 kolom. Kolom pertama adalah x1 yang berasal dari integer vector dan kolom kedua (x2) berasal dari factor vector sehingga keduanya dapat digabungkan pada sebuah data frame. Jika keduanya dipaksa digabungkan menjadi sebuah matrix, maka R akan mengubah kelas variabel h (kolom kedua) sehingga tidak lagi menjadi kelas factor.

matdat <- matrix(c(a[-10], h), 9, 2)
matdat
##       [,1] [,2]
##  [1,]    1    1
##  [2,]    2    2
##  [3,]    3    3
##  [4,]    4    1
##  [5,]    5    2
##  [6,]    6    3
##  [7,]    7    1
##  [8,]    8    2
##  [9,]    9    3
class(matdat)
## [1] "matrix"

List

List merupakan struktur data yang paling bebas pada R. Semua kelas variabel dapat digabungkan pada list, misalnya variabel a (integer), h (factor), dat (data frame), mat (matrix).

ll <- list(a, h, dat, mat)
ll
## [[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[2]]
## [1] a b c a b c a b c
## Levels: a b c
## 
## [[3]]
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
## 
## [[4]]
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
class(ll)
## [1] "list"

Bahkan, list dapat berupa list yang lain. Misalnya list ll dimasukkan kedalam list baru, dengan variabel yang lain (a dan h).

ll2 <- list(a, h, ll)
ll2
## [[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[2]]
## [1] a b c a b c a b c
## Levels: a b c
## 
## [[3]]
## [[3]][[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[3]][[2]]
## [1] a b c a b c a b c
## Levels: a b c
## 
## [[3]][[3]]
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
## 
## [[3]][[4]]
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
class(ll2)
## [1] "list"

Operasi variabel

Operasi dasar dapat diterapkan pada variabel jika tipe datanya sesuai. Misalnya:

numerical/ logical/ integer vector dengan numerical/ logical/ integer vector:

a2 <- 11.5:20.5
class(a2)
## [1] "numeric"
class(a)
## [1] "integer"
a
##  [1]  1  2  3  4  5  6  7  8  9 10
a2
##  [1] 11.5 12.5 13.5 14.5 15.5 16.5 17.5 18.5 19.5 20.5
a+a2
##  [1] 12.5 14.5 16.5 18.5 20.5 22.5 24.5 26.5 28.5 30.5

Panjang vektor yang dioperasikan harus sama, jika tidak akan ada warning karena vektor yang lebih pendek nilainya akan diulang.

> a + b
 [1]  6  8 10 12 14 16 18 13 15 17
Warning message:
In a + b : longer object length is not a multiple of shorter object length

Penjumlahan, pengurangan, perkalian matriks dengan konstanta:

mat
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
mat+10
##      [,1] [,2] [,3] [,4]
## [1,] 11.5 13.5 15.5 17.5
## [2,] 12.5 14.5 16.5 18.5
mat-2
##      [,1] [,2] [,3] [,4]
## [1,] -0.5  1.5  3.5  5.5
## [2,]  0.5  2.5  4.5  6.5
mat*2
##      [,1] [,2] [,3] [,4]
## [1,]    3    7   11   15
## [2,]    5    9   13   17

Penjumlahan, pengurangan, perkalian matriks dengan matriks:

mat+mat
##      [,1] [,2] [,3] [,4]
## [1,]    3    7   11   15
## [2,]    5    9   13   17
t(mat)%*%mat
##      [,1] [,2] [,3]  [,4]
## [1,]  8.5 16.5 24.5  32.5
## [2,] 16.5 32.5 48.5  64.5
## [3,] 24.5 48.5 72.5  96.5
## [4,] 32.5 64.5 96.5 128.5

Khusus perkalian matriks dengan matriks ingat aturan dimensi pada matriks!

> mat%*%mat
Error in mat %*% mat : non-conformable arguments

Indexing

Indexing dapat dilakukan pada variabel berupa vector, matrix, data frame, dan list.

Vektor dapat diindeks dengan []:

a
##  [1]  1  2  3  4  5  6  7  8  9 10
a[1]    #elemen nomor 1
## [1] 1
a[9:10] #elemen nomor 9 sampai dengan 10
## [1]  9 10
a[c(1,4:5,8:9)] #elemen nomor 1, 4, 5, 8, dan 9
## [1] 1 4 5 8 9

Matriks diindeks menggunakan [,]. Penggunaan drop = FALSE bertujuan untuk mempertahankan kelas variabel tetap sebuah matriks.

mat
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
mat[1,2]  #elemen baris 1 kolom 2
## [1] 3.5
mat[1:2,3:4] #elemen baris 1 dan 2, kolom 3 dan 4
##      [,1] [,2]
## [1,]  5.5  7.5
## [2,]  6.5  8.5
mat[,2] #semua elemen kolom 2
## [1] 3.5 4.5
mat[,2, drop = FALSE] #semua elemen kolom 2/ vektor kolom
##      [,1]
## [1,]  3.5
## [2,]  4.5
mat[1,] #semua elemen baris 1
## [1] 1.5 3.5 5.5 7.5

Penggunaan drop = FALSE dapat digunakan untuk membuat vektor baris.

matb <- mat[1,] #ambil elemen matriks pada baris 1 saja
matbd <- mat[1,,drop = FALSE] 
matb
## [1] 1.5 3.5 5.5 7.5
matbd
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
class(matb)
## [1] "numeric"
class(matbd)
## [1] "matrix"

Begitu pula dengan vektor kolom.

matk <- mat[,1] #ambil elemen matriks pada kolom 1 saja
matkd <- mat[,1, drop = FALSE]
matk
## [1] 1.5 2.5
matkd
##      [,1]
## [1,]  1.5
## [2,]  2.5
class(matk)
## [1] "numeric"
class(matkd)
## [1] "matrix"

array diindeks seperti dengan matriks yaitu [,] tetapi dengan jumlah koma yang berbeda tergantung dimensi dari array. drop = FALSE juga dapat digunakan untuk mempertahankan kelas variabel agar tetap array.

arrayx
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    1    3    2    1
## [2,]    2    1    3    2
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]    3    2    1    3
## [2,]    1    3    2    1
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    3    2
## [2,]    3    2    1    3
arrayx[,,3] #array 3 dimensi, jumlah koma = 2
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    3    2
## [2,]    3    2    1    3
arrayx[1,,3]
## [1] 2 1 3 2
arrayx[1,,3, drop = FALSE]
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    2    1    3    2
arrayx[,3,3]
## [1] 3 1

data frame diindeks seperti matriks yaitu dengan menggunakan [,] atau menggunakan nama kolomnya (variabel).

dat
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
dat[1:3,2] #elemen baris 1 sampai 3 dan kolom 2
## [1] a b c
## Levels: a b c
dat$x2[1:3] #elemen baris 1 sampai 3 dan kolom 1
## [1] a b c
## Levels: a b c
dat[4:8,] #elemen baris 4 sampai 8 dan semua kolom
##   x1 x2
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b

list diindeks menggunakan [[]].

ll
## [[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[2]]
## [1] a b c a b c a b c
## Levels: a b c
## 
## [[3]]
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
## 
## [[4]]
##      [,1] [,2] [,3] [,4]
## [1,]  1.5  3.5  5.5  7.5
## [2,]  2.5  4.5  6.5  8.5
ll[[3]] #elemen list yang ketiga
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
ll[[4]][,1, drop = FALSE] #elemen list yang keempat, 
##      [,1]
## [1,]  1.5
## [2,]  2.5
#karena elemen keempat adalah matriks maka 
#aturan matriks berlaku setelah tanda [[]].

Subsetting

Subsetting digunakan untuk memilih atau mengeluarkan komponen dalam variabel. Misalnya dari data dat hanya diambil berdasarkan nilai kolom x1 yang lebih kecil dari 5.

dat
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a
## 5  5  b
## 6  6  c
## 7  7  a
## 8  8  b
## 9  9  c
dat[dat$x1 < 5,]
##   x1 x2
## 1  1  a
## 2  2  b
## 3  3  c
## 4  4  a

Ambil data dari variabel dat yang kolom x2 nya “a” saja.

subset(dat, x2 == "a")
##   x1 x2
## 1  1  a
## 4  4  a
## 7  7  a

Ambil data dari variabel h yang mempunyai character “a” saja.

h
## [1] a b c a b c a b c
## Levels: a b c
h[h=="a"]
## [1] a a a
## Levels: a b c
subset(h, h=="a")
## [1] a a a
## Levels: a b c

Ambil data dari variabel a yang genap saja.

a
##  [1]  1  2  3  4  5  6  7  8  9 10
a[a%%2==0]
## [1]  2  4  6  8 10
subset(a, a%%2==0)
## [1]  2  4  6  8 10