Tutorial R
Selain perintah looping for
, while
, dan repeat
, R juga memiliki fungsi atau command yang dapat melakukan looping secara cepat yang dikenal dengan keluarga fungsi apply
.
Kita telah mempelajari tiga struktur perulangan (looping) yakni for
, while
, dan repeat
. Selain ketiga perintah looping tersebut, R juga memiliki fungsi atau command yang dapat melakukan looping secara cepat yang dikenal dengan keluarga fungsi apply
.
Keluarga fungsi apply
ini merupakan salah satu keunggulan R, sehingga jika memerlukan perulangan (looping), usahakan gunakan fungsi apply
, dibandingkan menggunakan perulangan seperti for
loop atau while
loop.
Fungsi apply
bekerja dengan jenis data matrik atau array. Kita dapat menentukan apakah suatu fungsi hanya akan diterapkan pada kolom saja, baris saja atau keduanya. Adapun format fungsi ini adalah sebagai berikut:
apply(X, MARGIN, FUN, ...)
X | berupa suatu array, termasuk matriks. |
MARGIN | berupa suatu vektor dengan nilai 1 atau 2 yang menandakan apakah suatu fungsi akan diterapkan pada baris, kolom atau keduanya sekaligus. Misalnya, 1: fungsi diterapkan pada baris, 2: fungsi diterapkan pada kolom, dan c(1,2): fungsi diterapkan pada baris dan kolom. |
FUN | fungsi yang akan diterapkan. |
... | argumen opsional untuk FUN. |
Sebagai contoh, kita akan terapkan fungsi apply
pada data car
yang merupakan dataset bawaan dalam R.
data(cars)
head(cars)
Output:
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
Sekarang, kita akan menghitung rata-rata per kolom dan per baris dan juga menghitung standar deviasi pada dataset car
dengan menggunakan fungsi apply
berdasarkan fungsi yang telah ada yakni mean
dan sd
.
# menghitung rata-rata per kolom dengan fungsi mean()
apply(cars, 2, mean)
Output:
speed dist
15.40 42.98
# menghitung rata-rata per baris dengan fungsi mean()
apply(cars[1:3,], 1, mean)
Output:
1 2 3
3.0 7.0 5.5
# standard deviasi per kolom
apply(cars, 2, sd)
Output:
speed dist
5.287644 25.769377
Selain menggunakan fungsi yang telah tersedia (misalnya mean dan sd), kita juga bisa membuat fungsi sendiri. Perhatikan contoh berikut ini.
## menggunakan fungsi yang kita buat sendiri
x <- 1:15
test <- function(x) {
if(x < 10) {
x - 1
} else {
x/x
}
}
apply(as.matrix(x), 1, test)
Output:
[1] 0 1 2 3 4 5 6 7 8 1 1 1 1 1 1
Fungsi ini akan sangat berguna jika kita ingin menghitung suatu nilai (misalnya rata-rata atau mean) berdasarkan suatu kelompok (grup) data berjenis factor atau kategorik. Adapun format fungsi ini adalah sebagai berikut:
tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)
X | berupa vektor, dataframe atau list. |
INDEX | list dari satu atau beberapa factor yang memiliki panjang sama dengan X. Elemen-elemen dipaksa menjadi tipe faktor dengan as.factor. |
FUN | fungsi yang akan digunakan. |
... | argumen opsional pada fungsi yang akan digunakan. |
default | logical; if FALSE, tapply always returns an array of mode "list"; in other words, a list with a dim attribute. If TRUE (the default), then if FUN always returns a scalar, tapply returns an array with the mode of the scalar. |
simplify | logical; if FALSE, tapply always returns an array of mode "list"; in other words, a list with a dim attribute. If TRUE (the default), then if FUN always returns a scalar, tapply returns an array with the mode of the scalar. |
Sebagai contoh, kita akan gunakan data iris
yang merupakan dataset bawaan (built-in dataset) dalam R.
data(iris)
head(iris)
Output:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
Selanjutnya, kita akan menghitung rata-rata dari petal.width (kolom ke-4) untuk setiap species (kolom ke-5).
# menghitung rata-rata dari petal.width untuk setiap species
tapply(as.vector(iris[,4]), factor(iris[,5]), mean)
Output:
setosa versicolor virginica
0.246 1.326 2.026
Fungsi ini hanya dapat digunakan pada vector, jika ingin melakukan hal yang sama ke matriks maka dapat menggunakan fungsi aggregate
. Perhatikan berikut ini.
## Rata-rata setiap variabel untuk setiap spesies
aggregate(iris[,1:4], list(iris$Species), mean)
Output:
Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
Fungsi lain yang termasuk dalam keluarga fungsi apply
adalah lapply
dan sapply
di mana keduanya dapat digunakan pada vector atau objek bertipe list
. Fungsi lapply
akan menghasilkan sebuah list sedangkan sapply
akan menghasilkan vector atau matriks.
lapply(X, FUN, ...)
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
X | berupa array, dataframe, atau list. |
FUN | fungsi yang akan diterapkan. |
... | argumen opsional untuk FUN. |
simplify | logical. Jika nilainya TRUE, maka output yang dihasilkan adalah bentuk sederhana dari vektor, matrix atau array. |
USE.NAMES | jika list memiliki nama pada setiap elemennya, maka nama elemen tersebut akan secara default ditampilkan. |
Sebagai contoh, kita akan gunakan dataset car
dan menghitung jumlah 5 elemen pertama untuk tiap variabel (speed dan dist). Pertama, kita simpan nilai 5 elemen pertama pada tiap variabel ke dalam list dengan nama mylist. Kemudian menghitung jumlahnya dengan fungsi sum
. Perhatikan sintaks berikut.
## lapply and sapply
mylist <- as.list(cars[1:5,])
mylist
Output:
$speed
[1] 4 4 7 7 8
$dist
[1] 2 10 4 22 16
## menghitung jumlah setiap elemen pada list dengan nama mylist
## hasilnya berupa list
lapply(mylist, sum)
Output:
$speed
[1] 30
$dist
[1] 54
## menghitung jumlah setiap elemen pada list dengan nama mylist
## hasilnya berupa vektor
sapply(mylist,sum)
Output:
speed dist
30 54
Anda hidup hanya sekali, tetapi jika Anda melakukannya dengan benar, sekali itu cukup.
Mae West