Bagian 4 Data Wrangling
Data wrangling, disebut juga data munging atau data manipulation (dalam konotasi positif), merupakam proses transformasi atau menyiapkan data menjadi format siap dianalisis. Banyak tantangan yang dihadapi dalam tahapan ini, mulai dari ukuran data yang besar, format yang beragam, sumber yang tidak terintegrasi dan lain-lain. Sehingga tidak heran jika data wrangling menghabiskan hingga 80% dari waktu keseluruhan analsis yang kita lakukan.
Aktivitas utama dalam data wrangling di antaranya adalah:
- Membuat kolom baru, biasanya diturunkan dari kolom yang sudah ada
- Subsetting data atau memilih baris dan/kolom tertentu dari data
- Sorting atau mengurutkan data
- Recoding atau mengkodekan ulang nilai-nilai dari data
- Merging data atau menggabungkan data, baik penggabungan baris maupun kolom
- Reshaping data atau mengubah format menjadi bentuk wide ataupun long
Pada bagian ini akan dipraktikan bagaimana melakukan data wrangling menggunakan paket base
atau paket-paket bawaan R lainnya. Adapun data yang akan digunakan adalah sebagai berikut:
<- data.frame(ID = c(1,2,3,5,6,7),
employees Name = c("Alex", "Joni", "Banu", "Ani", "Riska", "John"),
Age = c(21,27,18,25,22,27),
Sex = c("M","M","M", "F", "F","M"))
employees
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 3 3 Banu 18 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
<- data.frame(ID = c(11,12,13),
more.employees Name = c("Bunga", "Kembang", "Puspa"),
Age = c(25,27,21),
Sex = c("M","M","M"))
more.employees
## ID Name Age Sex
## 1 11 Bunga 25 M
## 2 12 Kembang 27 M
## 3 13 Puspa 21 M
<- data.frame(ID = c(1,2,3,5,6,7),
address City = c("Bandung","Jakarta","Bogor", "Jakarta", "Bandung", "Jakarta"))
address
## ID City
## 1 1 Bandung
## 2 2 Jakarta
## 3 3 Bogor
## 4 5 Jakarta
## 5 6 Bandung
## 6 7 Jakarta
4.1 Inspeksi dataframe
Selelum melakukan data wranglingk lebih lanjut, hal utama yang dikerjakan ada inspeksi terhadap dataframe, diantaranya menampilkan jumlah baris dan kolom, melihat statistik ringkasan, melihat struktur dataframe serta melihat beberapa baris data (baik baris teratas maupun terbawah)
# menghitung jumlah baris
nrow(employees)
## [1] 6
# menghitung jumlah baris
ncol(employees)
## [1] 4
# menghitung dimensi (baris dan kolom)
dim(employees)
## [1] 6 4
# menghitung statistik ringkasan
summary(employees)
## ID Name Age Sex
## Min. :1.00 Length:6 Min. :18.00 Length:6
## 1st Qu.:2.25 Class :character 1st Qu.:21.25 Class :character
## Median :4.00 Mode :character Median :23.50 Mode :character
## Mean :4.00 Mean :23.33
## 3rd Qu.:5.75 3rd Qu.:26.50
## Max. :7.00 Max. :27.00
# melihat struktur dataframe
str(employees)
## 'data.frame': 6 obs. of 4 variables:
## $ ID : num 1 2 3 5 6 7
## $ Name: chr "Alex" "Joni" "Banu" "Ani" ...
## $ Age : num 21 27 18 25 22 27
## $ Sex : chr "M" "M" "M" "F" ...
# menampilkan beberapa baris teratas
head(employees)
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 3 3 Banu 18 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
# menampilkan beberapa baris terbawah
tail(employees)
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 3 3 Banu 18 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
4.2 Mengakses elemen
Mengakses atau memilih sebagian elemen dari dataframe dapat menggunakan operator [ ]
, [[ ]]
dan $
# baris 1, kolom 2
1,2] employees[
## [1] "Alex"
# baris 1, kolom "Name"
1,"Name"] employees[
## [1] "Alex"
# baris 1, kolom "Name"
1,]$Name employees[
## [1] "Alex"
# baris ke-1, semua kolom
1,] employees[
## ID Name Age Sex
## 1 1 Alex 21 M
# kolom ke-2, semua baris
2] employees[,
## [1] "Alex" "Joni" "Banu" "Ani" "Riska" "John"
# kolom "Name", semua baris
"Name"] employees[,
## [1] "Alex" "Joni" "Banu" "Ani" "Riska" "John"
# kolom "Name", semua baris
$Name employees
## [1] "Alex" "Joni" "Banu" "Ani" "Riska" "John"
# baris 1-2, semua kolom
1:2,] employees[
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
# kolom 1-2, semua baris
1:2] employees[,
## ID Name
## 1 1 Alex
## 2 2 Joni
## 3 3 Banu
## 4 5 Ani
## 5 6 Riska
## 6 7 John
# kolom 1-2, semua baris
c(1, 2)] employees[,
## ID Name
## 1 1 Alex
## 2 2 Joni
## 3 3 Banu
## 4 5 Ani
## 5 6 Riska
## 6 7 John
# kolom "ID" dan "Name", semua baris
c("ID", "Name")] employees[,
## ID Name
## 1 1 Alex
## 2 2 Joni
## 3 3 Banu
## 4 5 Ani
## 5 6 Riska
## 6 7 John
# semua kolom, hanya baris yang memenuhi kriteria
$Age > 20, ] employees[employees
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
4.3 Mengubah data
Dimungkinkan untuk mengubah/mengupdate nilai dari dataframe (misalnya jika diketahui ada kesalahan pencatatan)
# Mengubah data di baris ke-3 kolom "Age"
3,"Age"] <- 29
employees[ employees
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 3 3 Banu 29 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
4.4 Mengurutkan baris
Mengurutkan baris dapat dilakukan secara ascending (dari kecil ke besar, atau A-Z) atau descending (dari kecil ke besar, atau Z-A).
# mengurutkan ascending
order(employees$Age),] employees[
## ID Name Age Sex
## 1 1 Alex 21 M
## 5 6 Riska 22 F
## 4 5 Ani 25 F
## 2 2 Joni 27 M
## 6 7 John 27 M
## 3 3 Banu 29 M
# mengurutkan descending
order(employees$Age, decreasing=T),] employees[
## ID Name Age Sex
## 3 3 Banu 29 M
## 2 2 Joni 27 M
## 6 7 John 27 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 1 1 Alex 21 M
4.5 Menggabungkan dataframe
Penggabungan dataframe dapat dilakukan secara column-wise (merge) ataupun row-wise (union). Untuk merge, bisa dilakukan dengan perintah merge()
(berdasarkan ID tertentu), atau cbind()
(berdasarkan urutan baris). Untuk penggabungan union, bisa menggunakan rbind()
# menggabungkan kolom berdasarkan ID
merge(employees, address, by="ID")
## ID Name Age Sex City
## 1 1 Alex 21 M Bandung
## 2 2 Joni 27 M Jakarta
## 3 3 Banu 29 M Bogor
## 4 5 Ani 25 F Jakarta
## 5 6 Riska 22 F Bandung
## 6 7 John 27 M Jakarta
# menggabungkan kolom berdardasarkan urutan baris
<- c(100, 120, 110, 90, 130, 120)
Salary cbind(employees, Salary)
## ID Name Age Sex Salary
## 1 1 Alex 21 M 100
## 2 2 Joni 27 M 120
## 3 3 Banu 29 M 110
## 4 5 Ani 25 F 90
## 5 6 Riska 22 F 130
## 6 7 John 27 M 120
# menggabungkan baris berdasarkan urutan kolom
<- rbind(employees, more.employees)
all.employees all.employees
## ID Name Age Sex
## 1 1 Alex 21 M
## 2 2 Joni 27 M
## 3 3 Banu 29 M
## 4 5 Ani 25 F
## 5 6 Riska 22 F
## 6 7 John 27 M
## 7 11 Bunga 25 M
## 8 12 Kembang 27 M
## 9 13 Puspa 21 M
4.6 Agregasi data
Menghitung agregasi data
# menghitung rata-rata age
mean(all.employees$Age)
## [1] 24.88889
# menghitung jumlah employees berdasarkan jenis kelamin
aggregate(all.employees$Sex, list(City=all.employees$Sex), FUN=length)
## City x
## 1 F 2
## 2 M 7
4.7 Reshaping dataframe
Reshaping adalah mengubah format dataframe dari “long” ke “wide” atau sebaliknya. Sebagai contoh
# https://riptutorial.com/r/example/12036/the-reshape-function
set.seed(1234)
<- data.frame(identifier=rep(1:5, each=3),
df location=rep(c("up", "down", "left", "up", "center"), each=3),
period=rep(1:3, 5), counts=sample(35, 15, replace=TRUE),
values=runif(15, 5, 10))[-c(4,8,11),]
df
## identifier location period counts values
## 1 1 up 1 28 9.052993
## 2 1 up 2 16 7.628488
## 3 1 up 3 22 9.573291
## 5 2 down 2 5 5.228851
## 6 2 down 3 16 7.280457
## 7 3 left 1 4 6.325933
## 9 3 left 3 22 7.536534
## 10 4 up 1 26 5.905481
## 12 4 up 3 15 6.006240
## 13 5 center 1 14 6.294049
## 14 5 center 2 14 9.960752
## 15 5 center 3 4 9.036762
4.7.1 Long to wide
Reshape ke format wide untuk pada kolom “period”
<- reshape(df, idvar="identifier", timevar="period",
df.wide v.names=c("values", "counts"), direction="wide")
df.wide
## identifier location values.1 counts.1 values.2 counts.2 values.3 counts.3
## 1 1 up 9.052993 28 7.628488 16 9.573291 22
## 5 2 down NA NA 5.228851 5 7.280457 16
## 7 3 left 6.325933 4 NA NA 7.536534 22
## 10 4 up 5.905481 26 NA NA 6.006240 15
## 13 5 center 6.294049 14 9.960752 14 9.036762 4
4.7.2 Wide to long
Reshape ke format long
reshape(df.wide, idvar="identifier",
varying=list(c(3,5,7), c(4,6,8)), direction="long")
## identifier location time values.1 counts.1
## 1.1 1 up 1 9.052993 28
## 2.1 2 down 1 NA NA
## 3.1 3 left 1 6.325933 4
## 4.1 4 up 1 5.905481 26
## 5.1 5 center 1 6.294049 14
## 1.2 1 up 2 7.628488 16
## 2.2 2 down 2 5.228851 5
## 3.2 3 left 2 NA NA
## 4.2 4 up 2 NA NA
## 5.2 5 center 2 9.960752 14
## 1.3 1 up 3 9.573291 22
## 2.3 2 down 3 7.280457 16
## 3.3 3 left 3 7.536534 22
## 4.3 4 up 3 6.006240 15
## 5.3 5 center 3 9.036762 4