Pemrograman Statistika dengan R

Algoritma dan Pemrograman

Algoritma adalah urutan instruksi atau langkah-langkah yang harus dilakukan untuk menyelesaikan masalah. Syarat algoritma yang baik adalah efisien, mudah diimplementasi, mudah dipahami, akurasi tinggi, bersifat umum, langkah jelas dan detail serta bisa dikembangkan. Struktur algoritma terdiri dari 3 bagian yaitu runtunan, pemilihan/ percabangan, dan perulangan.

Dasar - Dasar R

R is a language and environment for statistical computing and graphics. R is an integrated suite of software facilities for data manipulation, calculation and graphical display. It includes an effective data handling and storage facility, a suite of operators for calculations on arrays, in particular matrices, a large, coherent, integrated collection of intermediate tools for data analysis, graphical facilities for data analysis and display either on-screen or on hardcopy, and a well-developed, simple and effective programming language which includes conditionals, loops, user-defined recursive functions and input and output facilities.

Assignment

Untuk melakukan assignment (mengisi nilai) pada objek di R dapat dilakukan dengan tiga cara

Operator Description
<-, = Leftwards Assignment
-> Rightwards Assignment

Ketiga cara tersebut memberikan hasil yang sama.

Cara 1

A<-5
A
[1] 5

Cara 2

A=5
A
[1] 5

Cara 3

5 ->A
A
[1] 5

R bersifat case-sensitive sehingga objek A dan objek a, adalah dua objek yang berbeda.

A <- 5
A
[1] 5
a <- 6
a
[1] 6

Untuk menamakan suatu objek di R, ada beberapa aturan yang harus dipenuhi:

  • Diawali huruf (A-Z atau a-z) atau titik (.)
  • Tidak menggunakan spasi dan karakter spesial (!, @, #, dst)
  • Tidak menggunakan atau menghindari reserved word dalam R seperti NULL, TRUE, FALSE, q, c, t, dll

Objek di R

Vector

Untuk membuat vektor yang terdiri dari lebih dari satu elemen, maka gunakan fungsi c(). Beberapa fungsi lain yang juga dapat digunakan dalam membuat suatu vektor adalahseq(), rep(), paste().

Assign nilai pada suatu vektor dengan fungsi c()

a1 <- c(2,4,7,3)
a1
[1] 2 4 7 3
r1 <- c("Sushi", "Kebab", "Pizza", "Steak")
r1
[1] "Sushi" "Kebab" "Pizza" "Steak"

Dengan menggunakan fungsi assign

assign("a2", c("2", "4", "7", "3"))
a2
[1] "2" "4" "7" "3"

Membentuk baris bilangan dengan fungsi seq. Parameter by digunakan untuk memberikan interval pada baris bilangan.

# Membentuk baris bilangan 1-10 dengan interval 0.5
a3 <- seq(1,10, by=0.5)
a3
 [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0
[16]  8.5  9.0  9.5 10.0
# Membentuk baris bilangan 1-10 sebanyak 12, dengan interval akan dihitungkan dari program
a4 <- seq (1,10, length.out = 12)
a4
 [1]  1.000000  1.818182  2.636364  3.454545  4.272727  5.090909  5.909091
 [8]  6.727273  7.545455  8.363636  9.181818 10.000000

Membentuk bilangan berulang dengan fungsi rep

# Mengulang bilangan 1 sebanyak 3 kali
a5 <- rep(1,3)
a5
[1] 1 1 1
# Membentuk bari bilangan 1-3 dan diulang sebanyak 3 kali
a6 <- rep (1:3,3)
a6
[1] 1 2 3 1 2 3 1 2 3
# Membentuk baris bilangan 1-3, dan membentuk ulangan berdasarkan baris bilangan 1-3
# 1 akan diulang 1 kali, 2 akan diulang 2 kali, 3 diulang 3 kali
a7 <- rep (1:3, 1:3)
a7
[1] 1 2 2 3 3 3
# Membentuk baris bilanga 1-3, dan masing masing bilangan diulang 2 kali
# Output rep(2,3) adalah (2, 2, 2)
# Untuk mengulang masing masing bilangan sebanyak 2 kali
a8 <- rep (1:3, rep(2,3))
a8
[1] 1 1 2 2 3 3

Membuat pengulangan menggunakan parameter each

# Membentuk baris bilangan 1-3 yang masing masing diulang 2 kali
a9 <- rep (1:3, each=2)
a9
[1] 1 1 2 2 3 3

Membuat karakter berpola dengan menggunakan fungsi paste dan paste0. Fungsi paste akan menggabungkan character namun masih terdapat spasi. Fungsi paste0 akan menggabungkan character dengan menghilangkan spasi.

# sep ="" untuk menghilangkan spasi
a10 <- paste("A", 1:10, sep="")
a10
 [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10"
a11 <- paste0("A", 1:10)
a11
 [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10"
a12 <- paste("A", 1:10)
a12
 [1] "A 1"  "A 2"  "A 3"  "A 4"  "A 5"  "A 6"  "A 7"  "A 8"  "A 9"  "A 10"
a13 <- paste0("A", a8)
a13
[1] "A1" "A1" "A2" "A2" "A3" "A3"

Untuk mengakses suatu vektor dapat menggunakan [], di dalam tanda [] diisi dengan index dari suatu vektor. Fungsi length dapat digunakan untuk melihat panjang dari suatu vektor.

a2[3]
[1] "7"
a3[10:15]
[1] 5.5 6.0 6.5 7.0 7.5 8.0
a10[c(4,7,9)]
[1] "A4" "A7" "A9"
a13 [-c(1:2)]
[1] "A2" "A2" "A3" "A3"
length(a4)
[1] 12

Untuk menampilkan struktur/tipe data dan sekaligus elemen atau anggota atau isi dari vektor gunakan fungsi str()

str(a4)
 num [1:12] 1 1.82 2.64 3.45 4.27 ...

Latihan 1
Tentukan output syntax program berikut:

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"
c("la", "ye")[rep(rep(1:2, each=3),2)]
 [1] "la" "la" "la" "ye" "ye" "ye" "la" "la" "la" "ye" "ye" "ye"

Latihan 2

a <- rep(c('x','y'),times=5)
b <- c(1:10)
paste0(a,b)
 [1] "x1"  "y2"  "x3"  "y4"  "x5"  "y6"  "x7"  "y8"  "x9"  "y10"

Matrix

Matrix adalah vektor dua dimensi, terdiri dari baris dan kolom sehingga berbentuk segiempat. Untuk membuat suatu matrix maka digunakan fungsi matrix(). Parameter yang ada dalam fungsi matrix() tersebut adalah nrow yang menyatakan jumlah baris, ncol menyatakan jumlah kolom, dan byrow yang dapat bernilai TRUE atau FALSE. Jika byrow bernilai TRUE maka akan dibentuk matrix berdasarkan baris, jika bernilai FALSE maka akan dibentuk matrix berdasarkan kolom.

Ilustrasi membentuk matrix berukuran n baris x p kolom.

a14 <- 1:12
b1 <- matrix(a14,3, 4)
b1
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
b2 <- matrix(a14,3,4,byrow=TRUE)
b2
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
b3 <- matrix(1:10,4,4)
b3
     [,1] [,2] [,3] [,4]
[1,]    1    5    9    3
[2,]    2    6   10    4
[3,]    3    7    1    5
[4,]    4    8    2    6
b4 <- matrix(1:10,4,5)
b4
     [,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

Merubah objek vektor ke matrix

b5 <- a14
dim(b5)<-c(6,2) 
b5
     [,1] [,2]
[1,]    1    7
[2,]    2    8
[3,]    3    9
[4,]    4   10
[5,]    5   11
[6,]    6   12
b6 <- matrix(1:4,2)
b6
     [,1] [,2]
[1,]    1    3
[2,]    2    4
b7 <- matrix(6:9,2)
b7
     [,1] [,2]
[1,]    6    8
[2,]    7    9

Untuk menggabungkan baris dalam matrix dapat menggunakan fungsi rbind dan untuk menggabungkan kolom dalam matrix dapat menggunakan fungsi cbind.

b8 <- rbind(b6,b7)
b8
     [,1] [,2]
[1,]    1    3
[2,]    2    4
[3,]    6    8
[4,]    7    9
b9<- rbind(b7,b6)
b9
     [,1] [,2]
[1,]    6    8
[2,]    7    9
[3,]    1    3
[4,]    2    4

Untuk mengetahui ukuran matrix dapat menggunakan fungsi dim. Untuk mengetahui banyaknya elemen di dalam matrix dapat menggunakan fungsi length

dim(b8)
[1] 4 2
length(b8)
[1] 8

Untuk mengakses matriks dapat menggunakan [], tanda [] menyatakan index dari matrix tersebut.

Berikut adalah matrix b2 yang akan kita akses dengan tanda []

b2
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

Mengambil elemen matrix baris ke-2, kolom ke-3.

b2[2,3]
[1] 7

Mengambil elemen matrix baris ke-2 kolom ke-2 sampai 4.

b2[2,2:4]
[1] 6 7 8

Mengambil elemen matrix baris ke-1 dan 2 pada semua kolom.

b2[1:2,]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
b2[c(1,3),-2]
     [,1] [,2] [,3]
[1,]    1    3    4
[2,]    9   11   12
b2[10]
[1] 4

Array

Array adalah sebuah vektor dengan dimensi tidak terbatas. Untuk membuat suatu array dapat menggunakan fungsi array().

c1 <- array(a14,dim=c(2,2,3))
c1
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12
c2 <- array(a14,dim=c(2,1,2,3))
c2
, , 1, 1

     [,1]
[1,]    1
[2,]    2

, , 2, 1

     [,1]
[1,]    3
[2,]    4

, , 1, 2

     [,1]
[1,]    5
[2,]    6

, , 2, 2

     [,1]
[1,]    7
[2,]    8

, , 1, 3

     [,1]
[1,]    9
[2,]   10

, , 2, 3

     [,1]
[1,]   11
[2,]   12
c3 <- array(a14,dim=c(1,2,4,2))
c3
, , 1, 1

     [,1] [,2]
[1,]    1    2

, , 2, 1

     [,1] [,2]
[1,]    3    4

, , 3, 1

     [,1] [,2]
[1,]    5    6

, , 4, 1

     [,1] [,2]
[1,]    7    8

, , 1, 2

     [,1] [,2]
[1,]    9   10

, , 2, 2

     [,1] [,2]
[1,]   11   12

, , 3, 2

     [,1] [,2]
[1,]    1    2

, , 4, 2

     [,1] [,2]
[1,]    3    4
c4 <- array(a14,dim=c(3,4))
c4
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

Untuk dapat mengakses suatu array maka dapat menggunakan [].

c2[,,1,] #lembar 1 dari c2
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
c2[,,,2] #buku ke 2 dari c2
     [,1] [,2]
[1,]    5    7
[2,]    6    8
c2[,,1,3] #lembar ke 1 buku ke 3 dari c2
[1]  9 10

Factor

Factor adalah tipe data statistik yang digunakan untuk menyimpan varabel kategorik. Factor adalah objek berjenis vektor dengan level. Factor dapat menyimpan data secara berurutan (ordered) atau pun tidak berurutan (unordered). Untuk membuat sebuah factor dapat menggunakan fungsi factor().

Sebagai ilustrasi, berikut dibuat sebuah factor berisi golongan darah. Golongan darah ini merupakan skala pengukuran nominal.

a15 <- c("A","B","AB","O")
d1 <- factor(a15) #skala pengukuran nominal
d1
[1] A  B  AB O 
Levels: A AB B O
d2 <- factor(a15,levels=c("O","A","B","AB"))
d2
[1] A  B  AB O 
Levels: O A B AB

Factor berupa jenjang pendidikan dari SD sampai SMA, dengan tingkat pendidikan SD di bawah SMP, dan SMP di bawah SMA.

a16 <- c("SD","SMP","SMA")
d3 <- ordered(a16) #skala pengukuran ordinal
d3
[1] SD  SMP SMA
Levels: SD < SMA < SMP
d4 <- ordered(a16, levels=a16)
d4
[1] SD  SMP SMA
Levels: SD < SMP < SMA
d5 <- factor(a16, levels=a16, ordered=TRUE)
d5
[1] SD  SMP SMA
Levels: SD < SMP < SMA

Untuk dapat mengakses suatu faktor dapat menggunakan [].

d1[2]
[1] B
Levels: A AB B O
d4[2:3]
[1] SMP SMA
Levels: SD < SMP < SMA

List

List merupakan objek yang dapat mengandung berbagai elemen dengan berbagai tipe data yang berbeda. List bisa dikatakan sebagai vektor dengan elemen yang tidak sejenis. Untuk membentuk suatu list maka dapat menggunakan fungsi list()

a1; b2; c1; d2
[1] 2 4 7 3
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12
[1] A  B  AB O 
Levels: O A B AB
e1 <- list(a1,b2,c1,d2)
e1
[[1]]
[1] 2 4 7 3

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

[[3]]
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12


[[4]]
[1] A  B  AB O 
Levels: O A B AB

Maka terlihat list tersebut terdiri dari vector, matrix array, dan factor.

e2 <- list(vect=a1,mat=b2,array=c1,fac=d2)
e2
$vect
[1] 2 4 7 3

$mat
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

$array
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12


$fac
[1] A  B  AB O 
Levels: O A B AB

Cara untuk mengakses list

e1[[1]]
[1] 2 4 7 3
e2$fac
[1] A  B  AB O 
Levels: O A B AB
e2[2]
$mat
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
e1[c(2,4)]
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

[[2]]
[1] A  B  AB O 
Levels: O A B AB

Untuk melihat dimensi dari list maka dapat menggunakan fungsi dim

dim(e2)
NULL

Untuk melihat ukuran dari suatu list dapat menggunakan fungsi length

length(e2)
[1] 4

Untuk melihat tipe data komponen pembentuk list maka dapat menggunakan fungsi names

names(e2)
[1] "vect"  "mat"   "array" "fac"  

Data Frame

Data Frame dapat dianalogikan dengan matrix, namun setiap kolom bisa memiliki tipe data yang berbeda. Untuk membuat suatu data frame maka menggunakan fungsi data.frame()

a17 <- 11:15
d5 <- factor(LETTERS[6:10])
f1 <- data.frame(d5,a17)
f1
  d5 a17
1  F  11
2  G  12
3  H  13
4  I  14
5  J  15

Untuk mengakses suatu data frame dapat menggunakan tanda [].

f1[1,2]
[1] 11
f1[3,]
  d5 a17
3  H  13
f1$d5
[1] F G H I J
Levels: F G H I J
f1[,"a17"]
[1] 11 12 13 14 15

Untuk melihat nama-nama kolom dari suatu data frame dapat menggunakan fungsi colnames

colnames(f1)
[1] "d5"  "a17"

Untuk melihat informasi dari suatu data frame dapat menggunakan fungsi str

str(f1)
'data.frame':   5 obs. of  2 variables:
 $ d5 : Factor w/ 5 levels "F","G","H","I",..: 1 2 3 4 5
 $ a17: int  11 12 13 14 15

Untuk melihat ringkasan statistik dari suatu data frame dapat menggunakan perintah summary

summary(f1)
 d5         a17    
 F:1   Min.   :11  
 G:1   1st Qu.:12  
 H:1   Median :13  
 I:1   Mean   :13  
 J:1   3rd Qu.:14  
       Max.   :15  

Latihan 3 Seorang peneliti merancang sebuah perancangan percobaan RAKL dengan 4 perlakuan dan 3 kelompok(anggap lah respon percobaan berupa baris bilangan). Bantulah peneliti tersebut untuk membuat raw data seperti output tersebut.

perl <- paste0("P", rep(1:4, each=3))
perl<- as.factor(perl)
kel <- rep(1:3, 4)
kel <- as.factor(kel)
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

Pengolahan Objek

Operasi Aljabar Sederhana Vektor Numerik

Operasi aljabar sederhana dapat menggunakan operator aritmatika. Operator aritmatika yang dapat digunakan sebagai berikut

Operator Description
+ Add two vectors
- Substracts second vector from the first
* Multiplies both vectors
/ Divide the first vector with the second
%*% Give the remainder for the first vector with the second
%/% The result of division of first vector with second (quotient)
^ The first vector raised to the exponent of second vector
x1 <- c(2,6,9,5)
x2 <- 1:4
x3 <- x1 + 1:2
x4 <- x1 + 1:3
x5 <- x1*x2
x6 <- x1 %*% x1  #setara x'x
x7 <- x1 %o% x1  #setara xx'
x1=  2 6 9 5
x2=  1 2 3 4
x3=  3 8 10 7
x4=  3 8 12 6
x5=  2 12 27 20
x6=  146
x7=  4 12 18 10 12 36 54 30 18 54 81 45 10 30 45 25

Operasi Dasar Vektor Karakter

Beberapa fungsi pada vektor karakter adalah nchar untuk menghitung jumlah karakter pada suatu vektor. paste untuk menggabungkan character. substr dan substring untuk mengambil elemen. substr mengambil elemen ke-k sampai elemen ke k+n. substring mengambil elemen ke k sampai akhir, atau dengan batas yang sudah ditentukan.

Menghitung banyak character dari satu vector.

y1 <- c("Institut Pertanian Bogor")
nchar(y1)
[1] 24

Menghitung banyak character dari masing-masing vector.

y2 <- c("Adam","Pramesti","Fathi","Ririn")
nchar(y2)
[1] 4 8 5 5

Mengambil character ke-15 sampai 18 dari objek y1.

y3 <- substr(y1,15,18)
y3
[1] "nian"

Mengambil character ke-15 sampai selesai dari objek y1.

y4 <- substring(y1,15) 
y4
[1] "nian Bogor"

Mengambil character ke-4 sampai ke-8 dari objek y1.

y5 <- substring(y1,4,8) #”titut”
y5
[1] "titut"

Operasi Dasar Matriks

Fungsi-fungsi yang dapat digunakan untuk matriks adalah t untuk mencari transpose suatu matriks. %*% untuk melakukan perkalian matriks, %o%, diag, solve, eigen.

Z1 <- matrix(1:6,2,3)
Z2 <- matrix(1:6,3,2,byrow=T)
Z3 <- matrix(6:9,2,2)

Matrix Z1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Matrix Z2

     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

Matrix Z3

     [,1] [,2]
[1,]    6    8
[2,]    7    9

Perkalian matrix menggunakan %*%

Z4 <- Z1 %*% Z2
Z4
     [,1] [,2]
[1,]   35   44
[2,]   44   56

Perkalian elemen by elemen mattrix

Z5 <- Z3 * Z4
Z5
     [,1] [,2]
[1,]  210  352
[2,]  308  504

Menghitung invers matrix dengan fungsi solve

INVZ <- solve(Z4) #invers
INVZ
          [,1]      [,2]
[1,]  2.333333 -1.833333
[2,] -1.833333  1.458333
INVZ %*% Z4 #identitas
     [,1]         [,2]
[1,]    1 2.842171e-14
[2,]    0 1.000000e+00
h <- c(5,11)
p <- solve(Z4,h) #solusi SPL Zp=h
p
[1] -8.500  6.875
e <- eigen(Z4) #eigen value & eigen vector dr Z4
e$values #akses eigen values
[1] 90.7354949  0.2645051
e[[2]] #akses eigen vectors
          [,1]       [,2]
[1,] 0.6196295 -0.7848945
[2,] 0.7848945  0.6196295

Struktur Kendali

Struktur kendali berfungsi untuk mengendalikan alur eksekusi dari sekumpulan ekspresi dalam pemrograman. Umumnya terdapat dua jenis struktur kendali yaitu pengulangan (loop) dan percabangan (choice)

Eksekusi Bersyarat

Dapat menggunakan fungsi if else, ifelse, atau switch. if else digunakan untuk menyatakan kondisi - ekspresi - ekspresi. ifelse digunakan untuk kondisi, ekspresi benar, ekspresi salah. switch digunakan ketika “kondisi” = ekspresi, masing masing kondisi mempunyai ekspresi masing masing.

Penggunaan if

x <- 5 
if (x>0){
  print("Bilangan positif")
}
[1] "Bilangan positif"

Penggunaan if else

x <- 7
if (x > 0) {
  print("Bilangan positif")
} else {
  print ("Bilangan negatif")
}
[1] "Bilangan positif"

Penggunaan ifelse

x <- 1
ifelse(x>0, "Bilangan positif", "Bilangan negatif")
[1] "Bilangan positif"

Pengunaan switch

acak <- sample(1:5,1)
switch(EXPR=acak, "1" = "a", "2" = "z",
"3" = "m", "4" = "h", "5" = "t")
[1] "m"

Pengulangan (Loops)

Dapat menggunakan fungsi for, while, repeat. Untuk for berupa objek in sekuens kemudian ekspresi. Untuk while maka gunakan kondisi kemudian ekspresi. repeat gunakan ekspresi kemudian untuk menghentikan gunakan perintah break

Penggunaan for

for (i in 1:5) print(i^2)
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25

Penggunaan while

i <- 1
while (i<=5) {
  print(i^2)
  i=i+1
  }
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
z = 0
while(z<=10) {
  y=runif(20)
  z=sum(y)
  print(z)
  }
[1] 9.244493
[1] 10.59309

Penggunaan repeat

i<-1
m<-2
repeat {
  m<-m+i
  print(m)
  i<-i+1
  if(m>15)
    break 
  }
[1] 3
[1] 5
[1] 8
[1] 12
[1] 17

Tanpa Pengulangan

apply (array, margin, function, function args)

Penggunaan apply

Z6 <- matrix(1:25,5,5)
apply(Z6,1,sum)
[1] 55 60 65 70 75
apply(Z6,2,sd)
[1] 1.581139 1.581139 1.581139 1.581139 1.581139

Manajemen Data Frame

Manajemen data frame atau disebut juga data wrangling atau data munging is the process of transforming and mapping data from one “raw” data form into another format with the intent of making it more appropriate and valuable for a variety of downstream purposes such as analytics.. Manajemen data frame terdiri dari membuat peubah baru, subsetting data, sorting data, recoding data, merging data, dan reshaping data.

Membuat Peubah Baru

Dilakukan seperti membuat vektor (dengan indeks atau operasi seleksi).

namadataframe$namavariabelbaru<-ekspresi

namadataframe[nomorkolom]<-ekspresi

Sebagai ilustrasi kita memiliki sebuah data frame ‘data1’ yang terdiri dari variabel perl, kel, dan 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

Kemudian, akan ditambahkan peubah ‘baru1’ pada ‘data1’ yang berisi nilai 12 sampai 1 secara berurutan.

data1$baru1<- 12:1
data1
   perl kel resp baru1
1    P1   1    1    12
2    P1   2    3    11
3    P1   3    5    10
4    P2   1    7     9
5    P2   2    9     8
6    P2   3   11     7
7    P3   1   13     6
8    P3   2   15     5
9    P3   3   17     4
10   P4   1   19     3
11   P4   2   21     2
12   P4   3   23     1

Subsetting Data

Subsetting Data dilakukan untuk mengakses sebagian data dengan membuat ide logic untuk diterapkan dalam vektor logic yang diinginkan. Fungsi yang digunakan adalah ==, !=, >, >=,<, <=, %in%, duplicated(…), which(…), is.na(…), is.null(…), is.numeric(…), dll.

Mengambil data yang termasuk ‘Kelompok 1’ dari ‘data1’.

indeks1 <- data1$kel == 1
data2 <- data1[indeks1,]
data2
   perl kel resp baru1
1    P1   1    1    12
4    P2   1    7     9
7    P3   1   13     6
10   P4   1   19     3

Mengambil data yang termasuk ‘Kelompok 1’ atau ‘Perlakuan P2’.

indeks2 <- data1$kel == 1 | 
data1$perl == "P2"
data3 <- data1[indeks2,]
data3
   perl kel resp baru1
1    P1   1    1    12
4    P2   1    7     9
5    P2   2    9     8
6    P2   3   11     7
7    P3   1   13     6
10   P4   1   19     3

Mengambil amatan yang responnya berupa bilangan prima.

indeks3 <- data1$resp %in% 
c(2,3,5,7,11,13,17,19,23)
data4 <- data1[indeks3,]
data4
   perl kel resp baru1
2    P1   2    3    11
3    P1   3    5    10
4    P2   1    7     9
6    P2   3   11     7
7    P3   1   13     6
9    P3   3   17     4
10   P4   1   19     3
12   P4   3   23     1

Sorting Data

Sorting Data dilakukan untuk mengurutkan data berdasarkan beberapa peubah tertentu. Dilakukan dengan membuat vektor logika untuk melakukan pengurutan data. Fungsi yang sering digunakan order(…), sort(…), rev(…),, unique(…).

Sebagai ilustrasi, mengurutkan data1 berdasarkan ‘Kelompok’ secara ascending.

indeks4 <- order(data1$kel)
data5 <- data1[indeks4,]
data5
   perl kel resp baru1
1    P1   1    1    12
4    P2   1    7     9
7    P3   1   13     6
10   P4   1   19     3
2    P1   2    3    11
5    P2   2    9     8
8    P3   2   15     5
11   P4   2   21     2
3    P1   3    5    10
6    P2   3   11     7
9    P3   3   17     4
12   P4   3   23     1

Mengurutkan ‘data1’ berdasarkan ‘Kelompok’ dan ‘Respon’ secara descending.

indeks5 <- order(data1$kel, 
data1$resp, decreasing=TRUE)
data6 <- data1[indeks5,]
data6
   perl kel resp baru1
12   P4   3   23     1
9    P3   3   17     4
6    P2   3   11     7
3    P1   3    5    10
11   P4   2   21     2
8    P3   2   15     5
5    P2   2    9     8
2    P1   2    3    11
10   P4   1   19     3
7    P3   1   13     6
4    P2   1    7     9
1    P1   1    1    12

Mengurutkan ‘data1’ berdasarkan ‘Kelompok’ secara ascending dan ‘Respon’ secara descending.

indeks6 <- order(data1$resp, 
decreasing=TRUE)
data7 <- data1[indeks6,]
indeks7 <- order(data7$kel)
data8 <- data7[indeks7,]
data8
   perl kel resp baru1
10   P4   1   19     3
7    P3   1   13     6
4    P2   1    7     9
1    P1   1    1    12
11   P4   2   21     2
8    P3   2   15     5
5    P2   2    9     8
2    P1   2    3    11
12   P4   3   23     1
9    P3   3   17     4
6    P2   3   11     7
3    P1   3    5    10
data8$resp
 [1] 19 13  7  1 21 15  9  3 23 17 11  5
sort(data8$resp)
 [1]  1  3  5  7  9 11 13 15 17 19 21 23
rev(data8$resp)
 [1]  5 11 17 23  3  9 15 21  1  7 13 19
order(data8$resp)
 [1]  4  8 12  3  7 11  2  6 10  1  5  9
rank(data8$resp)
 [1] 10  7  4  1 11  8  5  2 12  9  6  3
data8$resp>10
 [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE
which(data8$resp>10)
[1]  1  2  5  6  9 10 11
data8$resp[data8$resp>10]
[1] 19 13 21 15 23 17 11
data8$resp[which(data8$resp>10)]
[1] 19 13 21 15 23 17 11

Recoding Data

Recoding data digunakan untuk membuat nlai baru dari nilai peubah yang sudah ada. Dapat dilakukan secara logical, fungsi ifelse() dan fungsi recode().

Sebagai ilustrasi adalah recoding pada ‘data8’ untuk variabel ‘respon’ dengan kondisi jika respon<15 maka Code = 1, selainnya Code = 0

#dengan logical
data8$Code1 <- 0*(data8$resp>=15) + 1*(data8$resp<15)
data8
   perl kel resp baru1 Code1
10   P4   1   19     3     0
7    P3   1   13     6     1
4    P2   1    7     9     1
1    P1   1    1    12     1
11   P4   2   21     2     0
8    P3   2   15     5     0
5    P2   2    9     8     1
2    P1   2    3    11     1
12   P4   3   23     1     0
9    P3   3   17     4     0
6    P2   3   11     7     1
3    P1   3    5    10     1
#dengan fungsi ifelse
data8$Code2 <- ifelse(data8$resp<15,1,0)
data8
   perl kel resp baru1 Code1 Code2
10   P4   1   19     3     0     0
7    P3   1   13     6     1     1
4    P2   1    7     9     1     1
1    P1   1    1    12     1     1
11   P4   2   21     2     0     0
8    P3   2   15     5     0     0
5    P2   2    9     8     1     1
2    P1   2    3    11     1     1
12   P4   3   23     1     0     0
9    P3   3   17     4     0     0
6    P2   3   11     7     1     1
3    P1   3    5    10     1     1
#dengan fungsi recode
library(car) 
data8$Code3 <- recode(data8$resp,'1:14=1; else=0')
data8
   perl kel resp baru1 Code1 Code2 Code3
10   P4   1   19     3     0     0     0
7    P3   1   13     6     1     1     1
4    P2   1    7     9     1     1     1
1    P1   1    1    12     1     1     1
11   P4   2   21     2     0     0     0
8    P3   2   15     5     0     0     0
5    P2   2    9     8     1     1     1
2    P1   2    3    11     1     1     1
12   P4   3   23     1     0     0     0
9    P3   3   17     4     0     0     0
 [ reached 'max' / getOption("max.print") -- omitted 2 rows ]

Merging Data

Merging data bisa dilakukan dengan rbind(), cbind(), atau merge()

Sebagai ilustrasi, misalkan kita mempunya Tabel 1.

tabel1 <- data.frame(Tr=c("P4","P2","P5"),
                     k1=c(50,100,200))
tabel1
  Tr  k1
1 P4  50
2 P2 100
3 P5 200

Kemudian data ‘tabel1’ tersebut akan kita gabungkan dengan ‘data1’ berdasarkan peubah pertamanya.

Cara pertama:

data9<-merge(data1, tabel1, 
by.x=1, by.y=1, all=FALSE)
data9
  perl kel resp baru1  k1
1   P2   3   11     7 100
2   P2   1    7     9 100
3   P2   2    9     8 100
4   P4   1   19     3  50
5   P4   2   21     2  50
6   P4   3   23     1  50

Cara kedua:

data10<-merge(data1, tabel1, 
by.x="perl",by.y="Tr",all=TRUE)
data10
   perl  kel resp baru1  k1
1    P1    1    1    12  NA
2    P1    2    3    11  NA
3    P1    3    5    10  NA
4    P2    3   11     7 100
5    P2    1    7     9 100
6    P2    2    9     8 100
7    P3    2   15     5  NA
8    P3    3   17     4  NA
9    P3    1   13     6  NA
10   P4    1   19     3  50
11   P4    2   21     2  50
12   P4    3   23     1  50
13   P5 <NA>   NA    NA 200

Reshaping Data

Reshaping data digunakan untuk membentuk data baru dengan cara long to wide format atau wide to long format. Untuk melakukannya dapat menggunakan fungsi reshape()

Sebagai ilustrasi, kita akan mengubah data1 menjadi data dengan setiap barisnya merupakan masing masing perlakukan.

Long to Wide

data11 <- reshape(data1[,-4], 
idvar="perl", timevar="kel", 
direction="wide")
data11
   perl resp.1 resp.2 resp.3
1    P1      1      3      5
4    P2      7      9     11
7    P3     13     15     17
10   P4     19     21     23

Wide to Long

data12 <- reshape(data11, 
idvar="Perl", timevar="Kel", 
direction="long")
data12
     perl kel resp.1
P1.1   P1   1      1
P2.1   P2   1      7
P3.1   P3   1     13
P4.1   P4   1     19
P1.2   P1   2      3
P2.2   P2   2      9
P3.2   P3   2     15
P4.2   P4   2     21
P1.3   P1   3      5
P2.3   P2   3     11
P3.3   P3   3     17
P4.3   P4   3     23

Referensi

Lutfi, Musthofa. (Februari 2019). Menguasai Bahasa R Teori dan Praktik. Penerbit Informatika.

Raharjo, Mulianto. (17 Februari 2021). STA561 Pemrograman Statistika: Objek di R. Retrieved from https://newlms.ipb.ac.id/

Raharjo, Mulianto. (17 Februari 2021). STA561 Pemrograman Statistika: Pengolahan Objek & Struktur Kendali. Retrieved from https://newlms.ipb.ac.id/

Raharjo, Mulianto. (24 Februari 2021). STA561 Pemrograman Statistika: Manajemen Data Frame. Retrieved from https://newlms.ipb.ac.id/

Soleh, A.M. (2021). STA561 Pemrograman Statistika: Pengantar Algoritma dan Pemrograman. Retrieved from https://newlms.ipb.ac.id/