Bagian 2 Pemrograman R Dasar
2.1 Input
R merupakan bahasa interpreter. Ketika kita memasukkan suatu input pada console R (atau menjalankan sebuah script R), sebuah program dalam sistem R, dinamakan interpreter, akan mengeksekusi perintah yang kita tulis. R juga bersifat interaktif, artinya setiap perintah yang kita tulis dapat langsung dievaluasi oleh R dan hasilnya dapat ditampilkan pada layar.
Misalnya, dengan memasukkan perintah perkalian berikut pada console R:
10*2
Ketika kita menekan tombol enter, R akan mengeksekusi dan menampilkan hasilnya
## [1] 20
Console R diawali tanda >
, yang menunjukkan bahwa R siap menerima perinta baru. Jika kita memasukan perintah yang tidak lengkap, maka tanda tersebut akan berubah menjadi tanda +
.
Semua perintah atau teks yang ditulis setelah tanda #
tidak akan dieksekusi oleh R. Biasanya ini berguna untuk memberikan komentar atau catatan
# perkalian 10 x 2
10*2
## [1] 20
2.2 Assigment
Dalam R, sangat disarankan untuk menggunakan tanda <-
sebagai operator assigment. obj <- expr
berarti masukkan nilai hasil dari operasi di sisi kanan (expr
) ke dalam objek di sisi kiri (obj
). Misalnya:
<- 20 x
Artinya kita memasukkan nilai 20
ke dalam objek x
. Contoh lain
<- 100 + 50 y
Artinya kita memasukkan hasi dari operasi 100 + 50
ke dalam objek y
. Selain dengan operator <-
, kita juga dapat menggunakan operator =
atau ->
.
Untuk menampilkan objek dalam layar, cukup tuliskan nama objek lalu enter.
x
## [1] 20
y
## [1] 150
Atau bisa juga dengan perintah print()
print(x)
## [1] 20
print(y)
## [1] 150
2.3 Penamaan Objek
Segala hal dalam R dipandang sebagai objek, misalnya data, fungsi, dan lain-lain. Objek-objek tersebut dapat “diberi nama” dengan apapun yang kita mau. Pada contoh sebelumnya, kita mempunyai objek dengan nama x
dan y
. Meskipun demikian, ada beberapa aturan penamaan objek dalam R yang harus dipenuhi, yaitu:
- Menggunakan kombinasi alfabet (a-z, A-Z), angka (0-9), titik (.) atau underscore (_),
- Hanya dapat diawali oleh alfabet, titik atau underscore dan tidak boleh diawali dengan angka,
- Tidak mengandung spasi, tab atau karakter khusus seperti !, @, #,
- Sebaiknya tidak menggunakan penamaan atau nilai yang sudah digunakan oleh R, seperti
c
,df
,rnorm
dan lainnya.
Ketika membuat sebuah program dalam R (atau bahasa pemrograman apapun), disarankan untuk menggunakan penamaan yang lazin dan konsisten, seperti:
- alllowercase: misal
adjustcolor
- period.separated: misal
plot.new
- underscore_separated: misal
numeric_version
- lowerCamelCase: misal
addTaskCallback
- UpperCamelCase: misal
SignatureMethod
Note: meskipun diizinkan, penggunaan undescore sebaiknya dihindari karena tidak diimplementasikan disemua engine S.
R bersifat case-sensitive
baik dalam penamaan objek maupun isi dari objek tersebut. Artinya huruf kecil dan huruf besar menunjukkan hal berbeda. Dengan demikian, “ABC” berbeda dengan “abc,” berbeda dengan “Abc” dan berbeda dengan “AbC” dan seterusnya.
2.4 Working Directory
Sesuai namanya, working directory adalah folder atau directory di mana kita bekerja. Untuk mengetahui working directory kita saat ini, bisa menggunakan perintah
getwd()
## [1] "D:/SSD21/Bookdown/sta561"
Untuk mengganti working directory, dapat menggunakan perintah
setwd("D:/Learning/R")
Perhatikan path dipisahkan oleh tanda /
, atau bisa juga dengan tanda \\
.
setwd("D:\\Learning\\R")
Untuk mengakses file yang berada dalam working directory, kita cukup menuliskan nama filenya saja, misalnya
read.csv("dataku.csv")
2.5 Objek Data
R mempunyai beberapa jenis mode objek dasar, atau disebut sebagai “atomic” class dari objek, yaitu:
character, misalnya
"ipb"
,"mahasiswa"
,"stastika"
numeric, misalnya
12, 2.3
,1.2e-2
complex, misalnya
1.2e6+2i
logical, misalnya
T
,F
,TRUE
,FALSE
Objek Angka:
Angka dalam R umumnya diperlakukan sebagai objek numerik (atau angka riil). Artinya, sebuah angka yang terlihat sebagai “1” atau “2,” sebetulnya direpresentasikan oleh R sebagai objek numerik, seperti “1.00” atau “2.00.” Apabila kita menginginkan objek integer, kita harus menambahkan akhiran L
. Misal untuk mendapatkan integer 1
harus ditulis 1L
.
2.6 Tipe Objek Data
Terdapat beberapa tipe objek data standar dalam R, yaitu:
Vector: tipe sederhana dari objek data dalam R di mana setiap elemennya mempunyai mode yang sama
Factor: vektor dengan anggota/elemennya berupa kategori
Matrix: vektor yang berdimensi dua yaitu baris dan kolom
Array: tipe objek yang dapat menyimpan data lebih dari dua dimensi
Dataframe: objek yang menyimpan data dalam bentuk tabular (baris dan kolom)
List: vektor dengan anggota/elemennya berupa objek. Mode dari elemen list boleh berbeda-beda
2.6.1 Vector
Vector merupakan objek data paling sederhana dalam R dan digunakan oleh hampir semua fungsi aritmetik. Dalam vector, mode anggota/elemen adalah sama. Ada beberapa cara membuat vector, di antaranya:
2.6.1.1 Membuat vector
Banyak cara membuat vector. Beberapa di antaranya adalah menggunakan perintah c()
, seq()
dan rep()
.
2.6.1.1.1 Fungsi c()
Sebuah vektor dapat dibuat dengan fungsi c()
di mana setiap elemen dipisahkan oleh tanda koma. Misalnya.
<- c(0.5, 0.6)
a a
## [1] 0.5 0.6
Contoh lain
<- c(TRUE, FALSE) ## logical
b <- c(T, F) ## logical
c <- c("a", "b", "c") ## character
d <- 9:29 ## integer
e <- c(1+0i, 2+4i) ## complex f
Kadang kita memasukkan objek dengan mode berbeda kedalam suatu vektor, baik karena disengaja maupun tidak. Apa yang akan terjadi?
<- c(1.7, "a") # character
a a
## [1] "1.7" "a"
<- c(TRUE, 2) # numeric
b b
## [1] 1 2
<- c("a", TRUE) # character
c c
## [1] "a" "TRUE"
Untuk kasus seperti itu, R akan mengkonversi data kedalam mode yang paling sesuai. Pada contoh pertama, ada dua kemungkinan mode yaitu numeric da character. Karena mengkonversi yang memungkinkan adalah konversi numeric ke character (bukan sebaliknya), maka akan mengkonversi 1.7
menjadi character "1.7"
.
2.6.1.1.2 Fungsi seq()
Fungsi seq()
digunakan untuk membuat vector yang berisi angka berurutan. Misalnya
Vector 1 sampai dengan 10, dengan incremental 1
<- seq(from = 1, to = 10)
x x
## [1] 1 2 3 4 5 6 7 8 9 10
Atau bisa ditulis dengan perintah berikut
<- 1:10
x x
## [1] 1 2 3 4 5 6 7 8 9 10
Vector 1 sampai dengan 10, dengan incremental 2
<- seq(from = 1, to = 10, by = 2)
y y
## [1] 1 3 5 7 9
2.6.1.1.3 Fungsi rep()
Fungsi rep()
digunakan untuk membuat vector dengan mengulang nilai yang diinginak, misalnya
<- rep(1, 10)
x x
## [1] 1 1 1 1 1 1 1 1 1 1
2.6.1.2 Mengakses element dari vector
Element pada vector dapat diakses melalui indeksnya dengan menggunakan operator [ ]
. Dua contoh berikut mengambil elemen pertama serta elemen ke-2 dan ke-3 dari vector
<- c(10, 20, 30, 40, 50)
x 1] x[
## [1] 10
c(2,3)] x[
## [1] 20 30
2.6.1.3 Fungsi lain
Fungsi lain sering digunakan dalam vector adalah length()
dan class()
. Fungsi length()
berguna untuk mengetahui pajang atau banyaknye elemen dari suatu vector sedangkan class()
untuk mengetahi class atau mode dari suatu vector.
2.6.2 Factor
Faktor digunakan untuk merepresentasikan data kategorik, baik terurut/ordered maupun tidak diurutkan/unordered. Faktor dapat dianggap sebagai vektor di mana setiap elemennya memiliki label. Objek faktor dapat dibuat dengan fungsi factor()
.
<- factor(c("SD", "SMA", "SMP", "SD", "SMA", "SMP", "SD", "SMP"))
f f
## [1] SD SMA SMP SD SMA SMP SD SMP
## Levels: SD SMA SMP
factor(f, levels = c("SD", "SMP", "SMA"))
## [1] SD SMA SMP SD SMA SMP SD SMP
## Levels: SD SMP SMA
factor(f, levels = c("SD", "SMP", "SMA"), ordered = TRUE)
## [1] SD SMA SMP SD SMA SMP SD SMP
## Levels: SD < SMP < SMA
length(y)
## [1] 5
class(y)
## [1] "numeric"
2.6.3 Matriks
Matriks/matrix merupakan vector yang berdimensi dua yaitu baris dan kolom. Matriks dapat dibuat dengan mengubah dimensi dari suatu vector.
Matriks dapat dibentuk dengan perintah matrix()
. Secara default, matriks dibentuk dengan cara column-wise (byrow = FALSE
), yaitu dengan mengisi kolom pertama terlebih dahulu, dari atas ke bawah, dilanjutkan kolom berikutnya.
Misalnya untuk membuat matriks berukuran 2 x 3 :
<- matrix(1:6, nrow = 2, ncol = 3)
m m
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Atau bisa dengan menambahkan argumen byrow = TRUE
sehingga akan mengisi baris pertama terlebih dahulu, mulai dari kiri ke kanan, dilanjutknya ke baris berikutnya.
<- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
m m
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
Matriks dapat dibentuk secara langsung dari vector dengan cara menambahkan atribut dimensi.
<- 1:10
m dim(m) <- c(2, 5)
m
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
Cara lain membentuk matriks adalah dengan penggabungan kolom dengan fungsi cbind()
dan penggabungan baris dengan fungsi rbind()
.
<- 1:3
x <- 10:12
y cbind(x, y)
## x y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
rbind(x, y)
## [,1] [,2] [,3]
## x 1 2 3
## y 10 11 12
2.6.4 Array
Array adalah struktur data yang dapat menampung data multidimensi. Dalam R, jika matriks hanya mempunyai 2 dimensi, maka array dapat memiliki lebih dari 2 dimensi.
<- c(5, 10, 15, 20)
v1 <- c(25, 30, 35, 40, 45, 50, 55, 60)
v2
<- array(c(v1, v2), dim =c(4,4,3)) arr
Untuk mengetahui dimensi dari suatu array, dapat menggunakan fungsi dim()
dim(arr)
## [1] 4 4 3
2.6.5 Dataframe
Baris dalam dataframe merepresentasikan pengamatan/observasi, sedangkan kolom mereprentasikan peubah/variable. Setiap elemen dalam kolom yang sama mempunyai mode yang sama, namun antar kolom bisa mempunyai mode yang berbeda.
Dataframe dapat dibuat menggunakan fungsi data.frame()
:
<- data.frame(foo = 1:4, bar = c(T, T, F, F))
df df
## foo bar
## 1 1 TRUE
## 2 2 TRUE
## 3 3 FALSE
## 4 4 FALSE
<- data.frame(numbers = c(10, 20, 30, 40),
df2 text = c("a", "b", "c", "a"))
df2
## numbers text
## 1 10 a
## 2 20 b
## 3 30 c
## 4 40 a
2.6.6 List
List merupakan bentuk khusus dari vector yang memungkinkan elemennya bisa berupa objek dengan mode yang berbeda-beda. Elemen-elemen dari list dapat berupa vector, matriks, array, list atau gabungan beberapa struktur data.
List dapat dibuat dengan menggunakan fungsi list()
<- "A"
s <- c(1:20)
v <- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
m <- data.frame(numbers = c(10, 20, 30, 40),
df text = c("a", "b", "c", "a"))
<- list(s, v, m, df)
l l
## [[1]]
## [1] "A"
##
## [[2]]
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
##
## [[3]]
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
##
## [[4]]
## numbers text
## 1 10 a
## 2 20 b
## 3 30 c
## 4 40 a
2.7 Missing value
Ada beberapa missing value dalam R, yaitu:
NULL
Sebuah objek yang diperoleh ketika suatu ekspresi atau fungsi menghasilkan nilai yang tidak terdefinisi (undefined value)
NA
Singkatan dari “Not Available.” Merupakan sebuah logical untuk mengindikasikan missing value.
NaN
Singkatan dari “Not a Number.” Merupakan sebuah logical untuk angka dan merupakan gambaran imajiner dari nilai nilai yang sangat kompleks.
Inf / -Inf
Singkatand ari infinity atau tidak hingga. Merupakan angka yang sangat besar atau sangat kecil.
<- c(1, 2, NA, 10, 3)
x is.na(x)
## [1] FALSE FALSE TRUE FALSE FALSE
is.nan(x)
## [1] FALSE FALSE FALSE FALSE FALSE
<- c(1, 2, NaN, NA, 4)
x is.nan(x)
## [1] FALSE FALSE TRUE FALSE FALSE
2.8 Penamaan Elemen
Objek R dapat mempunyai nama. Demikian juga dengan setiap elemen dalam sebuah objek data. Hal ini sangat berguna ketika menuliskan kode dan menjelaskan objek. Untuk memberikan nama bagi elemen-elemen dari vector, dapat menggunakan fungsi names()
<- 1:3
x names(x)
## NULL
names(x) <- c("New York", "Seattle", "Los Angeles")
x
## New York Seattle Los Angeles
## 1 2 3
names(x)
## [1] "New York" "Seattle" "Los Angeles"
Cara yang sama untuk list
names(l)
## NULL
names(l) <- c("teks", "vektor", "matriks", "tabel")
l
## $teks
## [1] "A"
##
## $vektor
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
##
## $matriks
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
##
## $tabel
## numbers text
## 1 10 a
## 2 20 b
## 3 30 c
## 4 40 a
names(l)
## [1] "teks" "vektor" "matriks" "tabel"
Matriks dapat mempunyai nama kolom dan barisnya dengan menggunakan fungsi dimnames()
<- matrix(1:4, nrow = 2, ncol = 2)
m dimnames(m) <- list(c("a", "b"), c("c", "d"))
m
## c d
## a 1 3
## b 2 4
Penamaan kolom dan baris pada matriks bisa dilakukan terpisah menggunakan fungsi colnames()
dan rownames()
colnames(m) <- c("h", "f")
rownames(m) <- c("x", "z")
m
## h f
## x 1 3
## z 2 4
Seperti halnya matriks, kolom dan baris pada dataframe juga dapat diberikan nama dengan menggunakan fungsi names()
dan rownames()
. Perhatikan ada perbedaan fungsi yang digunakan.
<- c(10, 20, 30, 40)
a <- c("a", "b", "c", "a")
b <- data.frame(a, b)
df df
## a b
## 1 10 a
## 2 20 b
## 3 30 c
## 4 40 a
names(df) <- c("numbers", "chars")
row.names(df) <- c("a", "b", "c", "d")
df
## numbers chars
## a 10 a
## b 20 b
## c 30 c
## d 40 a
Note: Ketika membuat dataframe, R akan memberikan nama untuk kolom-kolom yang terbentuk. Hanya saja kadang nama yang diberikan tidak sesuai dengan apa yang kita inginkan.
<- data.frame(c(10, 20, 30, 40),
df2 c("a", "b", "c", "a"))
names(df2)
## [1] "c.10..20..30..40." "c..a....b....c....a.."
2.9 Struktur Kendali
2.9.1 Percabangan
Pemilihan atau percabangan merupakan bagian penting dalam programming. Dalam R, hal ini dapat dilakukan dengan menggunakan perintah if ... else
.
if
Statement akan dieksekusi jika expression benar. Jika expression salah, maka tidak ada yang dieksekusi.
# https://www.datamentor.io/r-programming
if (expression) {
statement }
Contoh
<- 5
x if(x > 0){
print("Positive")
}
## [1] "Positive"
if … else
Jika expression benar, maka statement1 akan dieksekusi. Jaka salah maka statement2 akan dieksekusi.
if (expression) {
statement1else {
}
statement2 }
Contoh
<- -5
x if(x > 0){
print("Non Negative")
else {
} print("Negative")
}
## [1] "Negative"
if … else if … else
Jika expression benar, maka statement1 akan dieksekusi. Jaka salah maka akan periksa expression2. Jika bener maka statement2 akan dieksekusi. Jika salah maka statement3 akan dieksekusi
if ( expression) {
statement1else if ( expression2) {
}
statement2else {
}
statement3 }
Contoh:
<- -5
x if(x == 0){
prin("Zero")
else if(x < 0){
} print("Negative")
else {
} print("Positive")
}
## [1] "Negative"
2.9.2 Loop
Loop berfungsi untuk mengulang perintah atau blok perintah. Dalam R, ada beberapa fungsi perintah looping, yaitu for
, while
, repeat
for loop
For loop digunakan untuk mengiterasi vektor
for (val in sequence) {
statement }
Contoh mengiterasi vektor dan menjumlahkan angka genap
<- c(2,5,3,9,8,11,6)
x <- 0
count
for (val in x) {
if(val %% 2 == 0) {
= count+1
count
}
}
print(count)
## [1] 3
while loop
While loop digunakan untuk melakukan iterasi selama kondisi/expression tertentu terpenuhi.
while (expression)
{
statement }
Contoh
<- 1
i while (i < 6) {
print(i)
= i+1
i }
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
break dan next
Perintah break
gigunakan di dalam loop untuk menghentikan iterasi. Sedangkan perintah next
digunakan untuk melewati sebuah iterasi.
# break
if (expression) {
break
}
# next
if (expression) {
next
}
Contoh
# break, berhenti pada iterasi ke-3
<- 1:5
x for (val in x) {
if (val == 3){
break
}print(val)
}
## [1] 1
## [1] 2
# next, skip iterasi ke-3
<- 1:5
x for (val in x) {
if (val == 3){
next
}print(val)
}
## [1] 1
## [1] 2
## [1] 4
## [1] 5
repeat loop
Repeat loop digunakan untuk iterasi blok perintah berulang kali. Dalam repeat, tidak ada kondisi untuk keluar dari loop. Untuk itu, kita harus menggunakan perintah break
secara eksplisit atau looping akan terus berjalan (infinite loop)
repeat {
statement }
Contoh
<- 1
x repeat {
print(x)
= x+1
x if (x == 6){
break
} }
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5