LAPORAN PRAKTIKUM I

Oleh: Andika Putri Ratnasari (G1501211018)

OBJEK DI R

I. VECTOR

a1<-c(2,4,7,3)
a1
## [1] 2 4 7 3
assign("a2",c("2","4","7","3"))
a2
## [1] "2" "4" "7" "3"
Baris Bilangan
#baris bilangan
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
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
Bilangan Berulang
#bilangan berulang
a5 <-rep(1,3) #angka 1 diulang 3 kali
a5
## [1] 1 1 1
a6 <-rep(1:3,3) #angka 1 2 3 sebanyak 3 kali
a6
## [1] 1 2 3 1 2 3 1 2 3
a7 <-rep(1:3,1:3) #angka 1, 2, 2, 3, 3, 3 
a7
## [1] 1 2 2 3 3 3
a8 <-rep(1:3,rep(2,3)) #angka 11 22 33
a8
## [1] 1 1 2 2 3 3
a9 <-rep(1:3,each=2) #angka 11 22 33
a9
## [1] 1 1 2 2 3 3
Karakter Berpola
#karakter berpola
a10<-paste("A",1:10,sep="") #diberikan sep agar tanpa spasi
a10
##  [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10"
a11 <-paste0("A",1:10) #paste0 agar tanpa spasi
a11
##  [1] "A1"  "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9"  "A10"
a12<-paste("A",1:10,sep="-")
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"
Akses Vektor
#aksesvector
a2[3] #mengambil elemen ke-3
## [1] "7"
a3[10:15] #mengambil elemen ke 10 sampai 15
## [1] 5.5 6.0 6.5 7.0 7.5 8.0
a10[c(4,7,9)] #mengambil elemen ke 4 7 9
## [1] "A4" "A7" "A9"
a13[-c(1:2)] #membuang elemen 1 sampai 2
## [1] "A2" "A2" "A3" "A3"
length(a4) #panjang vektor
## [1] 12
Latihan 1
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)] #lalala yeyeye lalala yeyeye (pengulangan 2 kali)
##  [1] "la" "la" "la" "ye" "ye" "ye" "la" "la" "la" "ye" "ye" "ye"
Latihan 2
k<-c(1, 4, 7, 10, 13, 16, 19, 22, 25, 28)
b<-c("X1", "X2", "X3", "X4", "X5", "X5", "X7", "X8", "X9", "X10")
names(k)<-b #memberi nama vektor
k
##  X1  X2  X3  X4  X5  X5  X7  X8  X9 X10 
##   1   4   7  10  13  16  19  22  25  28

II. MATRIX

a14 <-1:12 #vektor
a14
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
b1<-matrix(a14,3,4) #matriks dengan dimensi 3*4 diurutkan berdasar kolom
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) #matriks 3 4 diurutkan berdasar baris
b2
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
b3<-matrix(1:16,4,4)
b3
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
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
Mengubah Objek dari Vector ke Matrix
#mengubah objek dari vector ke matrix
b5 <-a14
dim(b5)<-c(6,2) #mengubah dimensi matriks menjadi 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
Menggabungkan baris dan kolom
b8 <-rbind(b6,b7) #gabung baris
b8
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## [3,]    6    8
## [4,]    7    9
b9 <-cbind(b7,b6) #gabung kolom
b9
##      [,1] [,2] [,3] [,4]
## [1,]    6    8    1    3
## [2,]    7    9    2    4
Melihat Dimensi Matrix
dim(b8)
## [1] 4 2
dim(b9)
## [1] 2 4
dim(a14) #a14 masih vector sehingga dimensinya NULL
## NULL
length(b3) #menghitung banyaknya elemen matrix
## [1] 16

Akses Matrix

#aksesmatrix
b2
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
b2[2,3] #mengambil elemen baris ke 2 kolom ke 3
## [1] 7
b2[2,2:4] #mengambil baris ke 2 kolom 2 sampai 4
## [1] 6 7 8
b2[1:2,] #mengambil baris 1 2 untuk semua kolom
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
b2[c(1,3),-2]  #menghilangkan kolom ke 2
##      [,1] [,2] [,3]
## [1,]    1    3    4
## [2,]    9   11   12
b2[10] #memanggil elemen ke-10 urutannya kebawah (kolom)
## [1] 4

III. ARRAY

#vektor 1 dimensi
#matriks 2 dimensi
#array lebih dari sama dengan 2 dimensi 
c1<-array(a14,dim=c(2,2,3))
c2<-array(a14,dim=c(2,1,2,3))
c3 <-array(a14,dim=c(1,2,4,2))
c4 <-array(a14,dim=c(3,4))

Akses Array

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

IV. FACTOR

a15 <-c("A","B","AB","O")
d1 <-factor(a15) #skala pengukuran nominal
d2 <-factor(a15,levels=c("O","A","B","AB"))
levels(d2)
## [1] "O"  "A"  "B"  "AB"
a16 <-c("SD","SMP","SMA")
d3 <-ordered(a16) #skala pengukuran ordinal
d4 <-ordered(a16, levels=a16)
d5 <-factor(a16, levels=a16, ordered=TRUE)
levels(d4)
## [1] "SD"  "SMP" "SMA"

Akses Factor

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

V. 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
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

Akses 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
dim(e2)
## NULL
length(e2)
## [1] 4
names(e2)
## [1] "vect"  "mat"   "array" "fac"

VI. Data Frame

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

Akses Data Frame

#akses data frame
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
colnames(f1)
## [1] "d5"  "a17"
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
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(anggaplah respon percobaan berupa baris bilangan).Bantulah peneliti tersebut untuk membuat raw data seperti output sebagai berikut!

Kel<-rep(1:3, 4)
Perl<-paste0("P", Kel, sep="")
Perl
##  [1] "P1" "P2" "P3" "P1" "P2" "P3" "P1" "P2" "P3" "P1" "P2" "P3"
Resp<-seq(1,23, by=2)
Resp
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23
data1<-data.frame(Perl, Kel, Resp)
print.data.frame(data1)
##    Perl Kel Resp
## 1    P1   1    1
## 2    P2   2    3
## 3    P3   3    5
## 4    P1   1    7
## 5    P2   2    9
## 6    P3   3   11
## 7    P1   1   13
## 8    P2   2   15
## 9    P3   3   17
## 10   P1   1   19
## 11   P2   2   21
## 12   P3   3   23
is.data.frame(data1)
## [1] TRUE
as.data.frame(Resp)
##    Resp
## 1     1
## 2     3
## 3     5
## 4     7
## 5     9
## 6    11
## 7    13
## 8    15
## 9    17
## 10   19
## 11   21
## 12   23

PENGOLAHAN OBJEK & STRUKTUR KENDALI

Pengolahan Objek

Operasi Aljabar Sederhana Vektor Numerik

x1 <-c(3, 8, 2, 1)
x2 <-1:4
x3 <-x1 + 1:2
x3
## [1]  4 10  3  3
x4 <-x1 + 1:4
x4
## [1]  4 10  5  5
x5 <-x1*x2
x5
## [1]  3 16  6  4
x6 <-x1 %*% x1 #setara x'x
x6
##      [,1]
## [1,]   78
x7 <-x1 %o% x1 #setara xx'

Operasi dasar vektor karakter

y1 <-c("Institut Pertanian Bogor")
y1
## [1] "Institut Pertanian Bogor"
n1 <-nchar(y1) #panjang elemen termasuk spasi
y1
## [1] "Institut Pertanian Bogor"
y2 <-c("Andika","Putri","Ratna","Sari")
y2
## [1] "Andika" "Putri"  "Ratna"  "Sari"
n2 <-nchar(y2) #menghitung masing2 elemen
n2
## [1] 6 5 5 4
y3 <-substr(y1,10,18) 
y3
## [1] "Pertanian"
y4 <-substring(y1,10) 
y4
## [1] "Pertanian Bogor"
y5 <-substring(y1,20,24) 
y5
## [1] "Bogor"

Operasi dasar matriks

Z1 <-matrix(9:14,2,3)
Z2 <-matrix(9:14,3,2,byrow=T)
Z3 <-matrix(15:18,2,2)
Z4 <-Z1 %*% Z2
Z5 <-Z3 * Z4
INVZ <-solve(Z4) #invers
INVZ %*% Z4 #identitas
##              [,1] [,2]
## [1,] 1.000000e+00    0
## [2,] 9.094947e-13    1
h <-c(5,11)
p <-solve(Z4,h) #solusi SPL Zp=h
e <-eigen(Z4) #eigen value & eigen vector dari Z4
e$values#akses eigen values
## [1] 810.97040583   0.02959417
e[[2]] #akses eigen vectors
##           [,1]       [,2]
## [1,] 0.6763555 -0.7365753
## [2,] 0.7365753  0.6763555

Struktur Kendali

for (i in 1:9)
  print(i^2)
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
## [1] 36
## [1] 49
## [1] 64
## [1] 81
i<-1
while (i<=9) {
print(i^2)
i=i+1
}
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
## [1] 36
## [1] 49
## [1] 64
## [1] 81
y=runif(20)
for (i in y) {
if(i<0.5){
print(100*i)
} else print(i/100)
}
## [1] 0.009405762
## [1] 35.5258
## [1] 0.005849863
## [1] 0.006067227
## [1] 0.009498612
## [1] 0.009998096
## [1] 42.19962
## [1] 0.00942594
## [1] 46.00873
## [1] 41.11488
## [1] 0.009967809
## [1] 0.005802274
## [1] 0.009604392
## [1] 37.07154
## [1] 30.91846
## [1] 0.007192767
## [1] 0.009261381
## [1] 0.007912179
## [1] 0.008914636
## [1] 16.96045
z=0
while(z<=10) {
y=runif(20)
z=sum(y)
print(z)
}
## [1] 11.76103
acak <-sample(1:5,1)
switch(EXPR=acak, "1" = "a", "2" = "z", "3" = "m", "4" = "h", "5" = "t") #gak perlu pakai nested if karena bisa pakai switch lebih simple
## [1] "t"
Z6 <-matrix(1:25,5,5)
Z6
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    6   11   16   21
## [2,]    2    7   12   17   22
## [3,]    3    8   13   18   23
## [4,]    4    9   14   19   24
## [5,]    5   10   15   20   25
apply(Z6,1,sum) #jumlah setiap baris pada matriks
## [1] 55 60 65 70 75
apply(Z6,2,sd) #standar deviasi setiap kolom pada matriks
## [1] 1.581139 1.581139 1.581139 1.581139 1.581139

Latihan 1

Tentukan hasil dari setiap perintah berikut:

a<-0
for(i in 1:5) 
  { b<-a+i
  print(b)
  a<-b
}
## [1] 1
## [1] 3
## [1] 6
## [1] 10
## [1] 15
i<-1
z<-1
while(z<15)
{y<-z+i
  z<-y
  print(z)
  i<-i+1
}
## [1] 2
## [1] 4
## [1] 7
## [1] 11
## [1] 16
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

MANAJEMEN DATA FRAME

(DATA WRANGLING/MUNGING)

Membuat peubah baru dalam data frame

Subsetting data

Sorting data

Recoding data

Merging data

Reshaping data

DATA

Seorang peneliti merancang sebuah perancangan percobaan RAKL dengan 4 perlakuan dan 3 kelompok(anggaplah respon percobaan berupa baris bilangan).Kemudian disimpan dalam objek data1.

Perl <-paste("P",rep(1:4,each=3),sep="")
Kel<-factor(rep(1:3,4))
Resp<-seq(1,23,by=2)
data1 <-data.frame(Perl,Kel,Resp)
print.data.frame(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

Latihan 1

Pada data1, buatlah peubah baru1 yang berisi nilai dari 12 sampai 1 secara berurutan

Membuat Peubah Baru dalam Data Frame

data1$baru1<-12:1
print.data.frame(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

Dilakukan untuk akses sebagian data

Membuat ide logic untuk diterapkan dalam vektor logic yang diinginkan

Fungsi yang digunakan :

==, !=, >, >=, <, <=, %in%, duplicated(),which(),is.na(), is.null(), is.numeric(), dll.

Latihan 2

Dari data1 tersebut ambillah yang termasuk kelompok 1.

kelompok1<-data1$Kel==1
data2<-data1[kelompok1,]
print.data.frame(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

Latihan 3

Dari data1 tersebut ambillah yang termasuk kelompok 1 atau perlakuan P2.

kelompok1P2<-data1$Kel==1|data1$Perl=="P2"
data3<-data1[kelompok1P2,]
print.data.frame(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

Latihan 4

Dari data1 tersebut ambillah amatan yang responnya berupa bilangan prima.

prima<-data1$Resp %in% c(2,3,5,7,11,13,17,19,23)
data4<-data1[prima,]
print.data.frame(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

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()

Latihan 5

Urutkan data1 tersebut berdasarkan kelompok secara ascending

urutan1<-order(data1$Kel)
data5<-data1[urutan1,]
print.data.frame(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

Latihan 6

Urutkan data1 tersebut berdasarkan kelompok dan respon secara descending

urutan2<-order(data1$Kel, data1$Resp, decreasing = TRUE)
data6<-data1[urutan2,]
print.data.frame(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

Latihan 7

Urutkan data1 tersebut berdasarkan kelompok secara ascending dan respon secara descending.

#mengurutkan kelompok secara ascending
urutan3<-order(data1$Resp, decreasing = TRUE)
data7<-data1[urutan3,]

#mengurutkan kelompok secara ascending dan respon secara descending
urutan4<-order(data7$Kel, decreasing = FALSE)
data8<-data7[urutan4,]

print.data.frame(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
#Sorting Data
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

Digunakan untuk membuat nilai baru dari nilai peubahyang sudah ada

Dapat dilakukan secara logical, fungsi ifelse(), dan fungsi recode().

Latihan 8

Lakukanlah recoding pada data8 untuk variabel respon dengan kondisi jika respon<15 maka Code= 1, selainnya Code= 0

#denganlogical
data8$Code1 <-0*(data8$Resp>=15) + 1*(data8$Resp<15)

#dengan fungsi ifelse
data8$Code2 <-ifelse(data8$Resp<15,1,0)

#dengan fungsi recode
library(car)
data8$Code3 <-recode(data8$Resp,'1:14=1; else=0')

print.data.frame(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
## 6    P2   3   11     7     1     1     1
## 3    P1   3    5    10     1     1     1

Merging Data

Bisa dilakukan dengan rbind() atau cbind()

Lebih mudah dengan fungsi merge()

Latihan 9

Gabungkanlah data1 dengan tabel1 berdasarkan peubah pertamanya

tabel1 <-data.frame( 
  Tr=c("P4","P2","P5"), 
  k1=c(50,100,200))
data9<-merge(data1, tabel1, by.x=1, by.y=1, all=FALSE)
data10<-merge(data1, tabel1, by.x="Perl",by.y="Tr",all=TRUE)
print.data.frame(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
print.data.frame(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

Membentuk data baru dengan cara :

  1. Long to wide format
  2. Wide to long format

Menggunakan fungsi reshape()

Latihan 10

Ubahlah data1 menjadi data dengan setiap barisnya merupakan masing-masing perlakuan

#long to wide
data11 <-reshape(data1[,-4], idvar="Perl", timevar="Kel", direction="wide")
print.data.frame(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")
print.data.frame(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

MANAGEMENT DATA FRAME (tidyverse)

Package tidyverse mengumpulkan fungsi-fungsi dari berbagai package yang ditujukan untuk "share an underlying design philosophy, grammar, and data structures of tidy data". Beberapa package utama yang dikumpulkan pada tidyverse, yaitu readr, readxl (import data tabular), tibble (modifikasi dari objek data.frame), tidyr (merapikan data), stringr (mengolah string/karakter), lubridate (mengolah format date), dplyr (memanipulasi data), ggplot2 (visualisasi data).

library(readxl)
library(dplyr)
library(tidyverse)

Pipe Operator (%>%)

Pipe operator dikembangkan untuk memudahkan user untuk membaca program, mengubah tata penulisan argumen dalam fungsi menjadi program yang sekuensial (menunjukkan urutan pengerjaan). Serangkaian fungsi R yang menggunakan tanda kurung ( ), jika disatukan dalam satu baris akan menyebabkan program R tidak mudah dibaca.

Teladan 1. Compute the logarithm of x, return suitably lagged and iterated differences, compute the exponential function, and round the result.

x <- c(0.109, 0.359, 0.63, 0.996, 0.515, 0.142, 0.017, 0.829, 0.907)
round(exp(diff(log(x))), 1)
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1

Dengan menggunakan pipe operator (%>%):

x %>% log() %>% 
  diff() %>% 
  exp() %>% 
  round(1)
## [1]  3.3  1.8  1.6  0.5  0.3  0.1 48.8  1.1

Data Dummy

Deskripsi Kasus

Seorang peneliti merancang sebuah perancangan percobaan RAKL dengan 4 perlakuan dan 3 kelompok (anggaplah respon percobaan berupa baris bilangan), kemudian disimpan dalam objek data1.

Perl <- paste("P",rep(1:4,each=3),sep="")
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

Data Munging

1. Membuat Peubah Baru

Membuat peubah baru bisa menggunakan fungsi mutate.

Teladan 2.

Membuat peubah baru1 di data1 yang berisi nilai dari 12 sampai 1 secara berurutan.

# Menggunakan R base
data1$baru1 <- 12:1

# Menggunakan dplyr dengan pipe operator
data1 <- data1 %>% mutate(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

Teladan 3.

Membuat peubah baru1 di data1 yang berisi nilai 2 kali dari kuadrat peubah Resp.

# Menggunakan R base
data1$baru2 <- 2*data1$Resp^2

# Menggunakan dplyr dengan pipe operator
(data1 <- data1 %>% mutate(baru2=2*Resp^2))
##    Perl Kel Resp baru1 baru2
## 1    P1   1    1    12     2
## 2    P1   2    3    11    18
## 3    P1   3    5    10    50
## 4    P2   1    7     9    98
## 5    P2   2    9     8   162
## 6    P2   3   11     7   242
## 7    P3   1   13     6   338
## 8    P3   2   15     5   450
## 9    P3   3   17     4   578
## 10   P4   1   19     3   722
## 11   P4   2   21     2   882
## 12   P4   3   23     1  1058

Data Subsetting

Data subsetting terbagi menjadi dua, yaitu subsetting baris/observasi dan subsetting kolom/peubah. Untuk subsetting baris/observasi bisa menggunakan fungsi filter, sedangkan subsetting kolom/peubah bisa menggunakan fungsi select.

Teladan 4.

Mengambil observasi data1 yang termasuk kelompok 1.

# R base
indeks1 <- data1$Kel == 1
data2 <- data1[indeks1,]

subset(data1,Kel==1) #alternatif
##    Perl Kel Resp baru1 baru2
## 1    P1   1    1    12     2
## 4    P2   1    7     9    98
## 7    P3   1   13     6   338
## 10   P4   1   19     3   722
# Menggunakan dplyr dengan pipe operator
data1 %>% filter(Kel==1)
##   Perl Kel Resp baru1 baru2
## 1   P1   1    1    12     2
## 2   P2   1    7     9    98
## 3   P3   1   13     6   338
## 4   P4   1   19     3   722

Teladan 5.

Mengambil observasi data1 yang termasuk kelompok 1 dan/atau perlakuan P2.

# R base
indeks2 <- data1$Kel == 1 | data1$Perl == "P2"
data3 <- data1[indeks2,]

indeks2 <- data1$Kel == 1 & data1$Perl == "P2"
data3 <- data1[indeks2,]

#alternatif
subset(data1,data1$Kel == 1 | data1$Perl == "P2")
##    Perl Kel Resp baru1 baru2
## 1    P1   1    1    12     2
## 4    P2   1    7     9    98
## 5    P2   2    9     8   162
## 6    P2   3   11     7   242
## 7    P3   1   13     6   338
## 10   P4   1   19     3   722
subset(data1,data1$Kel == 1 & data1$Perl == "P2")
##   Perl Kel Resp baru1 baru2
## 4   P2   1    7     9    98
# Menggunakan dplyr dengan pipe operator
data1 %>% filter(Kel==1 | Perl=="P2")
##   Perl Kel Resp baru1 baru2
## 1   P1   1    1    12     2
## 2   P2   1    7     9    98
## 3   P2   2    9     8   162
## 4   P2   3   11     7   242
## 5   P3   1   13     6   338
## 6   P4   1   19     3   722
data1 %>% filter(Kel==1, Perl=="P2")
##   Perl Kel Resp baru1 baru2
## 1   P2   1    7     9    98

Tanda koma (pemisah argumen) di fungsi filter menyatakan operator irisan.

Teladan 6.

Mengambil observasi data1 yang peubah responnya berupa bilangan prima.

# R base
indeks3 <- data1$Resp %in% c(2,3,5,7,11,13,17,19,23)
data4 <- data1[indeks3,]

subset(data1,Resp %in% c(2,3,5,7,11,13,17,19,23)) #alternatif
##    Perl Kel Resp baru1 baru2
## 2    P1   2    3    11    18
## 3    P1   3    5    10    50
## 4    P2   1    7     9    98
## 6    P2   3   11     7   242
## 7    P3   1   13     6   338
## 9    P3   3   17     4   578
## 10   P4   1   19     3   722
## 12   P4   3   23     1  1058
# Menggunakan dplyr dengan pipe operator
data1 %>% filter(Resp %in% c(2,3,5,7,11,13,17,19,23))
##   Perl Kel Resp baru1 baru2
## 1   P1   2    3    11    18
## 2   P1   3    5    10    50
## 3   P2   1    7     9    98
## 4   P2   3   11     7   242
## 5   P3   1   13     6   338
## 6   P3   3   17     4   578
## 7   P4   1   19     3   722
## 8   P4   3   23     1  1058

Teladan 7.

Mengambil peubah Perl dan Resp dari data1.

# R base
data5 <- data1[,c("Perl","Resp")]
data5 <- data1[,c(1,3)] #alternatif
# Menggunakan dplyr dengan pipe operator
data1 %>% select(Perl,Resp)
##    Perl Resp
## 1    P1    1
## 2    P1    3
## 3    P1    5
## 4    P2    7
## 5    P2    9
## 6    P2   11
## 7    P3   13
## 8    P3   15
## 9    P3   17
## 10   P4   19
## 11   P4   21
## 12   P4   23
data1 %>% select(1,3) #alternatif
##    Perl Resp
## 1    P1    1
## 2    P1    3
## 3    P1    5
## 4    P2    7
## 5    P2    9
## 6    P2   11
## 7    P3   13
## 8    P3   15
## 9    P3   17
## 10   P4   19
## 11   P4   21
## 12   P4   23

Teladan 8.

Mengambil semua peubah kecuali Resp dan baru1 dari data1.

# R base
data6 <- data1[,-(3:4)]
# Menggunakan dplyr dengan pipe operator
data1 %>% select(-Resp,-baru1)
##    Perl Kel baru2
## 1    P1   1     2
## 2    P1   2    18
## 3    P1   3    50
## 4    P2   1    98
## 5    P2   2   162
## 6    P2   3   242
## 7    P3   1   338
## 8    P3   2   450
## 9    P3   3   578
## 10   P4   1   722
## 11   P4   2   882
## 12   P4   3  1058
data1 %>% select(-(3:4)) #alternatif
##    Perl Kel baru2
## 1    P1   1     2
## 2    P1   2    18
## 3    P1   3    50
## 4    P2   1    98
## 5    P2   2   162
## 6    P2   3   242
## 7    P3   1   338
## 8    P3   2   450
## 9    P3   3   578
## 10   P4   1   722
## 11   P4   2   882
## 12   P4   3  1058

Teladan 9.

Mengambil peubah Kel dan baru2 dari data1 yang nilai peubah responnya lebih dari 10.

# R base
data7 <- data1[data1$Resp>10,c(2,5)]
# Menggunakan dplyr dengan pipe operator
data1 %>% filter(Resp>10) %>% select(Kel,baru2)
##   Kel baru2
## 1   3   242
## 2   1   338
## 3   2   450
## 4   3   578
## 5   1   722
## 6   2   882
## 7   3  1058

Data Sorting

Data sorting menggunakan fungsi arrange. Selain itu, fungsi desc juga bisa digunakan di dalam fungsi arrange untuk mengurutkan secara descending.

Teladan 10.

Mengurutkan data1 berdasarkan kelompok secara ascending.

# R base
indeks4 <- order(data1$Kel)
data8 <- data1[indeks4,]
# Menggunakan dplyr dengan pipe operator
data1 %>% arrange(Kel)
##    Perl Kel Resp baru1 baru2
## 1    P1   1    1    12     2
## 2    P2   1    7     9    98
## 3    P3   1   13     6   338
## 4    P4   1   19     3   722
## 5    P1   2    3    11    18
## 6    P2   2    9     8   162
## 7    P3   2   15     5   450
## 8    P4   2   21     2   882
## 9    P1   3    5    10    50
## 10   P2   3   11     7   242
## 11   P3   3   17     4   578
## 12   P4   3   23     1  1058

Teladan 11.

Mengurutkan data1 berdasarkan kelompok dan respon secara descending.

# R base
data1 %>% arrange(desc(Kel),desc(Resp))
##    Perl Kel Resp baru1 baru2
## 1    P4   3   23     1  1058
## 2    P3   3   17     4   578
## 3    P2   3   11     7   242
## 4    P1   3    5    10    50
## 5    P4   2   21     2   882
## 6    P3   2   15     5   450
## 7    P2   2    9     8   162
## 8    P1   2    3    11    18
## 9    P4   1   19     3   722
## 10   P3   1   13     6   338
## 11   P2   1    7     9    98
## 12   P1   1    1    12     2
# Menggunakan dplyr dengan pipe operator
data1 %>% arrange(Kel)
##    Perl Kel Resp baru1 baru2
## 1    P1   1    1    12     2
## 2    P2   1    7     9    98
## 3    P3   1   13     6   338
## 4    P4   1   19     3   722
## 5    P1   2    3    11    18
## 6    P2   2    9     8   162
## 7    P3   2   15     5   450
## 8    P4   2   21     2   882
## 9    P1   3    5    10    50
## 10   P2   3   11     7   242
## 11   P3   3   17     4   578
## 12   P4   3   23     1  1058

Teladan 12.

Mengurutkan data1 berdasarkan kelompok secara ascending dan respon secara descending.

# R base
indeks6 <- order(data1$Resp, decreasing=TRUE)
data10 <- data1[indeks6,]
indeks7 <- order(data10$Kel)
data11 <- data7[indeks7,]
# Menggunakan dplyr dengan pipe operator
data1 %>% arrange(Kel,desc(Resp))
##    Perl Kel Resp baru1 baru2
## 1    P4   1   19     3   722
## 2    P3   1   13     6   338
## 3    P2   1    7     9    98
## 4    P1   1    1    12     2
## 5    P4   2   21     2   882
## 6    P3   2   15     5   450
## 7    P2   2    9     8   162
## 8    P1   2    3    11    18
## 9    P4   3   23     1  1058
## 10   P3   3   17     4   578
## 11   P2   3   11     7   242
## 12   P1   3    5    10    50

Teladan 13.

Mengambil nilai peubah baru1 yang lebih dari 10 dari output di Teladan 12.

# R base
data12 <- data1$baru1[which(data11$Resp>10)]
# Menggunakan dplyr dengan pipe operator
data1 %>% arrange(Kel,desc(Resp)) %>% filter(Resp>10) %>% select(baru1)
##   baru1
## 1     3
## 2     6
## 3     2
## 4     5
## 5     1
## 6     4
## 7     7
#Program ini akan menghasilkan output yang berbeda dengan program sebelumnya.
data11 <- data1 %>% arrange(Kel,desc(Resp))
data11 %>% select(baru1) %>% filter(Resp>10)
##   baru1
## 1     5
## 2     8
## 3    11
## 4     1
## 5     4
## 6     7
## 7    10

Join Data Frame

Join data frame bisa dilakukan menggunakan fungsi inner_join, full_join, left_join, dan right_join.

Misalkan ada tabel1 yang isinya sebagai berikut:

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

Teladan 14.

Menggabungkan data1 dengan tabel1 berdasarkan peubah pertamanya (Perl dan Tr).

# R base
data13 <- merge(data1, tabel1, by.x=1, by.y=1, all=FALSE)
data14 <- merge(data1, tabel1, by.x="Perl",by.y="Tr",all=TRUE)
# Menggunakan dplyr dengan pipe operator
data1 %>% inner_join(tabel1,by=c("Perl"="Tr"))
##   Perl Kel Resp baru1 baru2  k1
## 1   P2   1    7     9    98 100
## 2   P2   2    9     8   162 100
## 3   P2   3   11     7   242 100
## 4   P4   1   19     3   722  50
## 5   P4   2   21     2   882  50
## 6   P4   3   23     1  1058  50
data1 %>% full_join(tabel1,by=c("Perl"="Tr"))
##    Perl  Kel Resp baru1 baru2  k1
## 1    P1    1    1    12     2  NA
## 2    P1    2    3    11    18  NA
## 3    P1    3    5    10    50  NA
## 4    P2    1    7     9    98 100
## 5    P2    2    9     8   162 100
## 6    P2    3   11     7   242 100
## 7    P3    1   13     6   338  NA
## 8    P3    2   15     5   450  NA
## 9    P3    3   17     4   578  NA
## 10   P4    1   19     3   722  50
## 11   P4    2   21     2   882  50
## 12   P4    3   23     1  1058  50
## 13   P5 <NA>   NA    NA    NA 200

Fungsi inner_join hanya memasukkan observasi yang nilai key variable ada di kedua tabel (operator irisan) sehingga setelah digabung akan menghasilkan tabel yang lengkap. Sedangkan full_join memasukkan seluruh observasi hasil gabungan key variable di kedua tabel (operator gabungan).

Teladan 15.

Setelah data1 dan tabel1 digabung, hanya diambil peubah Perl, Kel, dan Resp.

# R base
data15 <- data13[,1:3]
# Menggunakan dplyr dengan pipe operator
data1 %>% inner_join(tabel1,by=c("Perl"="Tr")) %>% select(1:3)
##   Perl Kel Resp
## 1   P2   1    7
## 2   P2   2    9
## 3   P2   3   11
## 4   P4   1   19
## 5   P4   2   21
## 6   P4   3   23
#alternatif
data15 <- data1 %>% inner_join(tabel1,by=c("Perl"="Tr"))
data15 %>% select(1:3)
##   Perl Kel Resp
## 1   P2   1    7
## 2   P2   2    9
## 3   P2   3   11
## 4   P4   1   19
## 5   P4   2   21
## 6   P4   3   23

Data Aggregating

Fungsi yang bisa digunakan untuk data agregating adalah summarise, yang juga bisa dikombinasikan dengan penggunaan fungsi group_by untuk mengelompokkan agregasi per kategori.

Teladan 16.

Menghitung banyaknya observasi, nilai maksimum, nilai minimum, dan rataan dari peubah Resp pada data1.

# R base
data16 <- data.frame(n=nrow(data1), maks=max(data1$Resp), 
                     min=min(data1$Resp), rataan=mean(data1$Resp))
# Menggunakan dplyr dengan pipe operator
data1 %>% summarise(n=n(), maks=max(Resp), min=min(Resp), rataan=mean(Resp))
##    n maks min rataan
## 1 12   23   1     12

Teladan 17.

Menghitung banyaknya observasi, rataan peubah Resp, dan simpangan baku Resp1 per perlakuan dari data1.

# R base
data17 <- data.frame(aggregate(Resp~Perl,FUN=length,data=data1),
                rataan=aggregate(Resp~Perl,FUN=mean,data=data1)[,-1],    
                s=aggregate(Resp~Perl,FUN=sd,data=data1)[,-1])
# Menggunakan dplyr dengan pipe operator
data1 %>% group_by(Perl) %>% summarise(n=n(),rataan=mean(Resp),s=sd(Resp))
## # A tibble: 4 x 4
##   Perl      n rataan     s
##   <chr> <int>  <dbl> <dbl>
## 1 P1        3      3     2
## 2 P2        3      9     2
## 3 P3        3     15     2
## 4 P4        3     21     2

Data Reshaping/Pivoting

Data reshaping/pivoting adalah mengubah tabel dari long format menjadi wide format dan sebaliknya. Fungsi yang bisa digunakan untuk data reshaping adalah pivot_wider dan pivot_longer.

Teladan 18.

Mengubah data1 menjadi data dengan setiap barisnya merupakan masing-masing perlakuan (wide format), kemudian mengembalikan lagi menjadi long format.

# R base
#long to wide
data18 <- reshape(data1[,-(4:5)], idvar="Perl", timevar="Kel", direction="wide")

#wide to long
data19 <- reshape(data18, idvar="Perl", timevar="Kel", direction="long")
# Menggunakan dplyr dengan pipe operator
#long to wide
(data18 <- data1 %>% select(-(baru1:baru2)) %>% pivot_wider(names_from=Kel, values_from=Resp,names_prefix="Kel"))
## # A tibble: 4 x 4
##   Perl   Kel1  Kel2  Kel3
##   <chr> <dbl> <dbl> <dbl>
## 1 P1        1     3     5
## 2 P2        7     9    11
## 3 P3       13    15    17
## 4 P4       19    21    23
#wide to long
data18 %>% pivot_longer(!Perl,names_to="Kel",values_to="Resp",names_prefix="Kel")
## # A tibble: 12 x 3
##    Perl  Kel    Resp
##    <chr> <chr> <dbl>
##  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

LATIHAN

Data Indeks Pembangunan Manusia

Deskripsi data

Data ini berisikan nilai Indeks Pembangunan Manusia tingkat Kab/Kota dan Provinsi tahun 2010-2018 beserta komponen-komponen pembentuknya, yaitu Angka Harapan Hidup (AHH), Harapan Lama Sekolah (HLS/EYS), Rataan Lama Sekolah (RLS/MYS), dan Pengeluaran (PPP).Jika file data dibuka menggunakan Microsoft Excel, maka terlihat tampilannya seperti gambar di bawah ini.

Sumber: https://ipm.bps.go.id/data/nasional

library(readxl)
ipm <- read_xlsx("D:/ipm_metode_baru.xlsx",sheet="Provinsi",skip=3) #sesuai alamat direktori
str(ipm)
## tibble [35 x 47] (S3: tbl_df/tbl/data.frame)
##  $ Kode     : chr [1:35] "1100" "1200" "1300" "1400" ...
##  $ Provinsi : chr [1:35] "ACEH" "SUMATERA UTARA" "SUMATERA BARAT" "RIAU" ...
##  $ 2010...3 : num [1:35] 69.1 67.5 67.6 70.2 69.9 ...
##  $ 2011...4 : num [1:35] 69.1 67.6 67.8 70.3 70 ...
##  $ 2012...5 : num [1:35] 69.2 67.8 68 70.5 70.2 ...
##  $ 2013...6 : num [1:35] 69.3 67.9 68.2 70.7 70.3 ...
##  $ 2014...7 : num [1:35] 69.4 68 68.3 70.8 70.4 ...
##  $ 2015...8 : num [1:35] 69.5 68.3 68.7 70.9 70.6 ...
##  $ 2016...9 : num [1:35] 69.5 68.3 68.7 71 70.7 ...
##  $ 2017...10: num [1:35] 69.5 68.4 68.8 71 70.8 ...
##  $ 2018...11: num [1:35] 69.6 68.6 69 71.2 70.9 ...
##  $ 2010...12: num [1:35] 12.9 11.8 12.2 11.8 11.3 ...
##  $ 2011...13: num [1:35] 13 11.8 12.5 11.8 11.6 ...
##  $ 2012...14: num [1:35] 13.2 12 12.8 11.8 11.7 ...
##  $ 2013...15: num [1:35] 13.4 12.4 13.2 12.3 12.2 ...
##  $ 2014...16: num [1:35] 13.5 12.6 13.5 12.4 12.4 ...
##  $ 2015...17: num [1:35] 13.7 12.8 13.6 12.7 12.6 ...
##  $ 2016...18: num [1:35] 13.9 13 13.8 12.9 12.7 ...
##  $ 2017...19: num [1:35] 14.1 13.1 13.9 13 12.9 ...
##  $ 2018...20: num [1:35] 14.3 13.1 13.9 13.1 12.9 ...
##  $ 2010...21: num [1:35] 8.28 8.51 8.13 8.25 7.34 ...
##  $ 2011...22: num [1:35] 8.32 8.61 8.2 8.29 7.48 ...
##  $ 2012...23: num [1:35] 8.36 8.72 8.27 8.34 7.69 ...
##  $ 2013...24: num [1:35] 8.44 8.79 8.28 8.38 7.8 ...
##  $ 2014...25: num [1:35] 8.71 8.93 8.29 8.47 7.92 ...
##  $ 2015...26: num [1:35] 8.77 9.03 8.42 8.49 7.96 ...
##  $ 2016...27: num [1:35] 8.86 9.12 8.59 8.59 8.07 7.83 8.37 7.63 7.62 9.67 ...
##  $ 2017...28: num [1:35] 8.98 9.25 8.72 8.76 8.15 7.99 8.47 7.79 7.78 9.79 ...
##  $ 2018...29: num [1:35] 9.09 9.34 8.76 8.92 8.23 8 8.61 7.82 7.84 9.81 ...
##  $ 2010...30: num [1:35] 7934 9196 9339 9857 8478 ...
##  $ 2011...31: num [1:35] 8044 9231 9409 9957 8664 ...
##  $ 2012...32: num [1:35] 8134 9266 9479 10058 8944 ...
##  $ 2013...33: num [1:35] 8289 9309 9570 10180 9066 ...
##  $ 2014...34: num [1:35] 8297 9391 9621 10262 9141 ...
##  $ 2015...35: num [1:35] 8533 9563 9804 10364 9446 ...
##  $ 2016...36: num [1:35] 8768 9744 10126 10465 9795 ...
##  $ 2017...37: num [1:35] 8957 10036 10306 10677 9880 ...
##  $ 2018...38: num [1:35] 9186 10391 10638 10968 10357 ...
##  $ 2010...39: num [1:35] 67.1 67.1 67.3 68.7 65.4 ...
##  $ 2011...40: num [1:35] 67.4 67.3 67.8 68.9 66.1 ...
##  $ 2012...41: num [1:35] 67.8 67.7 68.4 69.1 66.9 ...
##  $ 2013...42: num [1:35] 68.3 68.4 68.9 69.9 67.8 ...
##  $ 2014...43: num [1:35] 68.8 68.9 69.4 70.3 68.2 ...
##  $ 2015...44: num [1:35] 69.4 69.5 70 70.8 68.9 ...
##  $ 2016...45: num [1:35] 70 70 70.7 71.2 69.6 ...
##  $ 2017...46: num [1:35] 70.6 70.6 71.2 71.8 70 ...
##  $ 2018...47: num [1:35] 71.2 71.2 71.7 72.4 70.7 ...

Data tersebut memiliki wide format dengan kolom-kolomnya adalah komponen dan tahun. Agar mudah dalam pengolahan data di R, data tersebut perlu diubah menjadi long format. Selain itu, beberapa hal yang juga dilakukan sekaligus saat mengubah format data, yaitu:

  1. Membuat peubah baru Komponen dan Tahun,
  1. Mengeluarkan nilai tingkat nasional yang terdapat pada baris "INDONESIA",
  1. Membuat peubah baru Pulau yang menandai kelompok kepulauan, dan
  1. Mengatur ulang urutan peubah (termasuk membuang peubah thn).
Komponen <- c("AHH","HLS","RLS","PPP","IPM") %>% rep(each=9) %>% rep(35)
ipm1 <- ipm %>% pivot_longer(!c(Kode,Provinsi),names_to="thn",values_to="Nilai") %>% 
  mutate(Tahun=rep(2010:2018,175),Komponen=Komponen)  %>% 
  filter(Provinsi!="INDONESIA")
ipm1$Pulau <- substr(ipm1$Kode,1,1) %>% as.numeric()
ipm1 <- ipm1 %>% select(1,2,7,6,5,4)
# View(ipm1)
str(ipm1)
## tibble [1,530 x 6] (S3: tbl_df/tbl/data.frame)
##  $ Kode    : chr [1:1530] "1100" "1100" "1100" "1100" ...
##  $ Provinsi: chr [1:1530] "ACEH" "ACEH" "ACEH" "ACEH" ...
##  $ Pulau   : num [1:1530] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Komponen: chr [1:1530] "AHH" "AHH" "AHH" "AHH" ...
##  $ Tahun   : int [1:1530] 2010 2011 2012 2013 2014 2015 2016 2017 2018 2010 ...
##  $ Nilai   : num [1:1530] 69.1 69.1 69.2 69.3 69.4 ...
# head(ipm1,n=10)
ipm1
## # A tibble: 1,530 x 6
##    Kode  Provinsi Pulau Komponen Tahun Nilai
##    <chr> <chr>    <dbl> <chr>    <int> <dbl>
##  1 1100  ACEH         1 AHH       2010  69.1
##  2 1100  ACEH         1 AHH       2011  69.1
##  3 1100  ACEH         1 AHH       2012  69.2
##  4 1100  ACEH         1 AHH       2013  69.3
##  5 1100  ACEH         1 AHH       2014  69.4
##  6 1100  ACEH         1 AHH       2015  69.5
##  7 1100  ACEH         1 AHH       2016  69.5
##  8 1100  ACEH         1 AHH       2017  69.5
##  9 1100  ACEH         1 AHH       2018  69.6
## 10 1100  ACEH         1 HLS       2010  12.9
## # ... with 1,520 more rows

Latihan 1

Mengambil data tahun 2018.

ipm1 %>% filter(Tahun==2018) #%>% View()
## # A tibble: 170 x 6
##    Kode  Provinsi       Pulau Komponen Tahun    Nilai
##    <chr> <chr>          <dbl> <chr>    <int>    <dbl>
##  1 1100  ACEH               1 AHH       2018    69.6 
##  2 1100  ACEH               1 HLS       2018    14.3 
##  3 1100  ACEH               1 RLS       2018     9.09
##  4 1100  ACEH               1 PPP       2018  9186   
##  5 1100  ACEH               1 IPM       2018    71.2 
##  6 1200  SUMATERA UTARA     1 AHH       2018    68.6 
##  7 1200  SUMATERA UTARA     1 HLS       2018    13.1 
##  8 1200  SUMATERA UTARA     1 RLS       2018     9.34
##  9 1200  SUMATERA UTARA     1 PPP       2018 10391   
## 10 1200  SUMATERA UTARA     1 IPM       2018    71.2 
## # ... with 160 more rows

Latihan 2

Mengambil data komponen IPM tahun 2018.

ipm1 %>% filter(Tahun==2018, Komponen=="IPM") #%>% View()
## # A tibble: 34 x 6
##    Kode  Provinsi             Pulau Komponen Tahun Nilai
##    <chr> <chr>                <dbl> <chr>    <int> <dbl>
##  1 1100  ACEH                     1 IPM       2018  71.2
##  2 1200  SUMATERA UTARA           1 IPM       2018  71.2
##  3 1300  SUMATERA BARAT           1 IPM       2018  71.7
##  4 1400  RIAU                     1 IPM       2018  72.4
##  5 1500  JAMBI                    1 IPM       2018  70.6
##  6 1600  SUMATERA SELATAN         1 IPM       2018  69.4
##  7 1700  BENGKULU                 1 IPM       2018  70.6
##  8 1800  LAMPUNG                  1 IPM       2018  69.0
##  9 1900  KEP. BANGKA BELITUNG     1 IPM       2018  70.7
## 10 2100  KEPULAUAN RIAU           2 IPM       2018  74.8
## # ... with 24 more rows

Latihan 3

Menghitung nilai minimum, maksimum, dan rataan nilai per komponen.

ipm1 %>% group_by(Komponen) %>% summarise(min=min(Nilai,na.rm=T),
                                          maks=max(Nilai,na.rm=T),rataan=mean(Nilai,na.rm=T))
## # A tibble: 5 x 4
##   Komponen     min    maks  rataan
##   <chr>      <dbl>   <dbl>   <dbl>
## 1 AHH        62.5     74.8   69.1 
## 2 HLS         8.57    15.6   12.3 
## 3 IPM        54.4     80.5   68.0 
## 4 PPP      6251.   18128   9746.  
## 5 RLS         5.59    11.0    7.95

Karena ada nilai NA pada Provinsi Kalimantan Utara tahun 2010-2012, penggunaan fungsi mean perlu ditambahkan argumen na.rm=TRUE.

Latihan 4

Mengambil nilai IPM dari provinsi di Sumatera dan Jawa.

ipm1 %>% filter(Pulau %in% 1:3,Komponen=="IPM") %>% select(-Pulau,-Komponen) %>% 
  pivot_wider(names_from = Tahun,values_from = Nilai)
## # A tibble: 16 x 11
##    Kode  Provinsi `2010` `2011` `2012` `2013` `2014` `2015` `2016` `2017` `2018`
##    <chr> <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 1100  ACEH       67.1   67.4   67.8   68.3   68.8   69.4   70     70.6   71.2
##  2 1200  SUMATER~   67.1   67.3   67.7   68.4   68.9   69.5   70     70.6   71.2
##  3 1300  SUMATER~   67.3   67.8   68.4   68.9   69.4   70.0   70.7   71.2   71.7
##  4 1400  RIAU       68.7   68.9   69.1   69.9   70.3   70.8   71.2   71.8   72.4
##  5 1500  JAMBI      65.4   66.1   66.9   67.8   68.2   68.9   69.6   70.0   70.6
##  6 1600  SUMATER~   64.4   65.1   65.8   66.2   66.7   67.5   68.2   68.9   69.4
##  7 1700  BENGKULU   65.4   66.0   66.6   67.5   68.1   68.6   69.3   70.0   70.6
##  8 1800  LAMPUNG    63.7   64.2   64.9   65.7   66.4   66.9   67.6   68.2   69.0
##  9 1900  KEP. BA~   66.0   66.6   67.2   67.9   68.3   69.0   69.6   70.0   70.7
## 10 2100  KEPULAU~   71.1   71.6   72.4   73.0   73.4   73.7   74.0   74.4   74.8
## 11 3100  DKI JAK~   76.3   77.0   77.5   78.1   78.4   79.0   79.6   80.1   80.5
## 12 3200  JAWA BA~   66.1   66.7   67.3   68.3   68.8   69.5   70.0   70.7   71.3
## 13 3300  JAWA TE~   66.1   66.6   67.2   68.0   68.8   69.5   70.0   70.5   71.1
## 14 3400  D I YOG~   75.4   75.9   76.2   76.4   76.8   77.6   78.4   78.9   79.5
## 15 3500  JAWA TI~   65.4   66.1   66.7   67.5   68.1   69.0   69.7   70.3   70.8
## 16 3600  BANTEN     67.5   68.2   68.9   69.5   69.9   70.3   71.0   71.4   72.0

Latihan 5

Mengambil data tahun 2017-2018 di pulau jawa dari semua komponen.

ipm1 %>% filter(Tahun %in% 2017:2018,Pulau==3) %>% select(-Pulau) %>% 
  pivot_wider(names_from = c(Komponen,Tahun),values_from = Nilai) #%>% View()
## # A tibble: 6 x 12
##   Kode  Provinsi  AHH_2017 AHH_2018 HLS_2017 HLS_2018 RLS_2017 RLS_2018 PPP_2017
##   <chr> <chr>        <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 3100  DKI JAKA~     72.6     72.7     12.9     13.0    11.0     11.0     17707
## 2 3200  JAWA BAR~     72.5     72.7     12.4     12.4     8.14     8.15    10285
## 3 3300  JAWA TEN~     74.1     74.2     12.6     12.6     7.27     7.35    10377
## 4 3400  D I YOGY~     74.7     74.8     15.4     15.6     9.19     9.32    13521
## 5 3500  JAWA TIM~     70.8     71.0     13.1     13.1     7.34     7.39    10973
## 6 3600  BANTEN        69.5     69.6     12.8     12.8     8.53     8.62    11659
## # ... with 3 more variables: PPP_2018 <dbl>, IPM_2017 <dbl>, IPM_2018 <dbl>

Karena kolom yang disusun terdiri atas 2 peubah, sehingga nama kolom secara otomatis diambil dari kombinasi nama komponen dan tahun.

Latihan 6

Menghitung rata-rata nilai per komponen per tahun.

ipm2 <- ipm1 %>% group_by(Komponen,Tahun) %>% summarise(rataan=mean(Nilai,na.rm=T)) 

ipm2
## # A tibble: 45 x 3
## # Groups:   Komponen [5]
##    Komponen Tahun rataan
##    <chr>    <int>  <dbl>
##  1 AHH       2010   68.5
##  2 AHH       2011   68.6
##  3 AHH       2012   68.8
##  4 AHH       2013   69.0
##  5 AHH       2014   69.1
##  6 AHH       2015   69.3
##  7 AHH       2016   69.4
##  8 AHH       2017   69.4
##  9 AHH       2018   69.6
## 10 HLS       2010   11.4
## # ... with 35 more rows

Mengubah tampilan data ipm2 dalam bentuk tabulasi silang (wide format).

ipm2 %>% pivot_wider(names_from = Komponen,values_from = rataan)
## # A tibble: 9 x 6
##   Tahun   AHH   HLS   IPM    PPP   RLS
##   <int> <dbl> <dbl> <dbl>  <dbl> <dbl>
## 1  2010  68.5  11.4  65.6  9120.  7.58
## 2  2011  68.6  11.7  66.2  9275.  7.66
## 3  2012  68.8  11.9  66.8  9447.  7.75
## 4  2013  69.0  12.2  67.5  9539.  7.83
## 5  2014  69.1  12.5  68.0  9592.  7.93
## 6  2015  69.3  12.7  68.6  9778.  8.02
## 7  2016  69.4  12.8  69.2 10029.  8.13
## 8  2017  69.4  13.0  69.8 10275.  8.26
## 9  2018  69.6  13.0  70.4 10623.  8.37

Setelah penggunaan group_by dan summarise, group dari tabel tersebut berkurang 1, yaitu group yang terakhir. Sehingga data ipm2 masih akan menyisakan 1 group. Jika diterapkan fungsi summarise kembali, maka sudah otomatis terkelompokkan pada outputnya.

groups(ipm2)
## [[1]]
## Komponen
ipm2 %>% summarise(rataan1=mean(rataan))
## # A tibble: 5 x 2
##   Komponen rataan1
##   <chr>      <dbl>
## 1 AHH        69.1 
## 2 HLS        12.3 
## 3 IPM        68.0 
## 4 PPP      9742.  
## 5 RLS         7.95

Karena ada group yang berkurang setelah penggunaan fungsi summarise, maka perbedaan urutan penulisan peubah dalam fungsi group_by akan menghasilkan output yang berbeda saat dilakukan summarise kembali.

ipm3 <- ipm1 %>% group_by(Tahun,Komponen) %>% summarise(rataan=mean(Nilai,na.rm=T))
groups(ipm3)
## [[1]]
## Tahun
ipm3 %>% summarise(rataan1=mean(rataan))
## # A tibble: 9 x 2
##   Tahun rataan1
##   <int>   <dbl>
## 1  2010   1855.
## 2  2011   1886.
## 3  2012   1920.
## 4  2013   1939.
## 5  2014   1950.
## 6  2015   1987.
## 7  2016   2038.
## 8  2017   2087.
## 9  2018   2157.

Latihan 7

Mengambil kolom Provinsi dan nilai HLS dari provinsi yang memiliki nilai IPM tahun 2018 lebih dari 70.

#alternatif 1
ipm1 %>% filter(Tahun==2018,Komponen %in% c("IPM","HLS")) %>% 
  pivot_wider(names_from = "Komponen",values_from = "Nilai") %>% 
  filter(IPM>70) %>% select(Provinsi,HLS) #%>%  View()
## # A tibble: 22 x 2
##    Provinsi               HLS
##    <chr>                <dbl>
##  1 ACEH                  14.3
##  2 SUMATERA UTARA        13.1
##  3 SUMATERA BARAT        14.0
##  4 RIAU                  13.1
##  5 JAMBI                 12.9
##  6 BENGKULU              13.6
##  7 KEP. BANGKA BELITUNG  11.9
##  8 KEPULAUAN RIAU        12.8
##  9 DKI JAKARTA           13.0
## 10 JAWA BARAT            12.4
## # ... with 12 more rows
#alternatif 2
ipm1 %>% pivot_wider(names_from = "Komponen",values_from = "Nilai") %>% 
  filter(Tahun==2018,IPM>70) %>% select(Provinsi,HLS) #%>%  View()
## # A tibble: 22 x 2
##    Provinsi               HLS
##    <chr>                <dbl>
##  1 ACEH                  14.3
##  2 SUMATERA UTARA        13.1
##  3 SUMATERA BARAT        14.0
##  4 RIAU                  13.1
##  5 JAMBI                 12.9
##  6 BENGKULU              13.6
##  7 KEP. BANGKA BELITUNG  11.9
##  8 KEPULAUAN RIAU        12.8
##  9 DKI JAKARTA           13.0
## 10 JAWA BARAT            12.4
## # ... with 12 more rows
# Apakah boleh jika programnya seperti ini?

ipm1 %>% pivot_wider(names_from="Komponen",values_from="Nilai") %>% select(Provinsi,HLS) %>% filter(Tahun==2018,IPM>70)

Program di atas tidak bisa dijalankan karena terdapat kesalahan dalam menuliskan urutan algoritme fungsi. Apabila dijalankan maka hasilnya adalah object Tahun is not found. Seharusnya fungsi yang dijalankan adalah filter terlebih dahulu kemudian select.

Urutan algoritme fungsi yang ditulis pada pipeline sangat perlu diperhatikan. Pada sebagian kasus, urutan penulisan fungsi bisa ditukar-tukar, tetapi sebagian yang lain tidak bisa.