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 fungsirecode()
.
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()
ataucbind()
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 :
- Long to wide format
- 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:
- Membuat peubah baru Komponen dan Tahun,
- Mengeluarkan nilai tingkat nasional yang terdapat pada baris "INDONESIA",
- Membuat peubah baru Pulau yang menandai kelompok kepulauan, dan
- 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 adalahfilter
terlebih dahulu kemudianselect
.
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.