Data wrangling, disebut juga data munging atau data manipulation (dalam konotasi positif), merupakan 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:

employees <- data.frame(ID = c(1,2,3,5,6,7), 
                        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
more.employees <- data.frame(ID = c(11,12,13), 
                            Name = c("Bunga", "Kembang", "Puspa"), 
                            Age = c(25,27,21),
                            Sex = c("M","M","M"))
more.employees
address <- data.frame(ID = c(1,2,3,5,6,7), 
                      City = c("Bandung","Jakarta","Bogor", "Jakarta", "Bandung", "Jakarta"))
address

Inspeksi data frame

Selelum melakukan data wrangling 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 kolom
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)
# menampilkan beberapa baris terbawah
tail(employees)

Mengakses elemen

Mengakses atau memilih sebagian elemen dari dataframe dapat menggunakan operator [ ], [[ ]] dan $

# baris 1, kolom 2
employees[1,2]
## [1] "Alex"
# baris 1, kolom "Name"
employees[1,"Name"] 
## [1] "Alex"
# baris 1, kolom "Name"
employees[1,]$Name
## [1] "Alex"
# baris ke-1, semua kolom
employees[1,]
# kolom ke-2, semua baris
employees[,2]
## [1] "Alex"  "Joni"  "Banu"  "Ani"   "Riska" "John"
# kolom "Name", semua baris
employees[,"Name"]
## [1] "Alex"  "Joni"  "Banu"  "Ani"   "Riska" "John"
# kolom "Name", semua baris
employees$Name
## [1] "Alex"  "Joni"  "Banu"  "Ani"   "Riska" "John"
# baris 1-2, semua kolom
employees[1:2,]
# kolom 1-2, semua baris
employees[,1:2]
# kolom 1-2, semua baris
employees[,c(1, 2)]
# kolom "ID" dan "Name", semua baris
employees[,c("ID", "Name")]
# semua kolom, hanya baris yang memenuhi kriteria
employees[employees$Age > 20, ]

Mengubah data

Dimungkinkan untuk mengubah/mengupdate nilai dari dataframe (misalnya jika diketahui ada kesalahan pencatatan)

# Mengubah data di baris ke-3 kolom "Age"
employees[3,"Age"] <- 29
employees

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
employees[order(employees$Age),]
# mengurutkan descending
employees[order(employees$Age, decreasing=T),]
employees[order(employees$Age, employees$ID, decreasing = c(FALSE, TRUE)),]

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")
# menggabungkan kolom berdardasarkan urutan baris
Salary <- c(100, 120, 110, 90, 130, 120)
cbind(employees, Salary) 
# menggabungkan baris berdasarkan urutan kolom
all.employees <- rbind(employees, more.employees)
all.employees

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)

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)
df <- data.frame(identifier=rep(1:5, each=3),
                 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

Long to wide

Reshape ke format wide untuk pada kolom “period”

df.wide <- reshape(df, idvar="identifier", timevar="period",
                   v.names=c("values", "counts"), direction="wide")
df.wide

Wide to long

Reshape ke format long

reshape(df.wide, idvar="identifier",
        varying=list(c(3,5,7), c(4,6,8)), direction="long")

  1. Statistika dan Sains Data, IPB University, ↩︎