Latihan P3_Wrangling Data Frame

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:

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

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

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,]
##   ID Name Age Sex
## 1  1 Alex  21   M
# 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,]
##   ID Name Age Sex
## 1  1 Alex  21   M
## 2  2 Joni  27   M
# kolom 1-2, semua baris
employees[,1:2]
##   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
employees[,c(1, 2)]
##   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
employees[,c(1, 2)]
##   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
employees[employees$Age > 20, ]
##   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

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
##   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

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),]
##   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
employees[order(employees$Age, decreasing=T),]
##   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
employees[order(employees$Age, employees$ID, decreasing = c(FALSE, TRUE)),]
##   ID  Name Age Sex
## 1  1  Alex  21   M
## 5  6 Riska  22   F
## 4  5   Ani  25   F
## 6  7  John  27   M
## 2  2  Joni  27   M
## 3  3  Banu  29   M

Menggabungkan data frame

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
Salary <- c(100, 120, 110, 90, 130, 120)
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
all.employees <- rbind(employees, more.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

Agregrasi data

Menghitung agregrasi 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

Reshaping data frame

# 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
##    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

Long to Wide

df.wide <- reshape(df, idvar="identifier", timevar="period",
                   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

Wide to 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