Manajemen Data Frame

Dalam manajemen Data Frame/Data Wrangling/Munging meliputi :
• Membuat peubah baru dalam data frame 
• Subsetting data 
• Sorting data 
• Recoding data 
• Merging data 
• Reshaping data 

Membuat Peubah Baru

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

Latihan 1

#Menambah peubah baru1
data1$baru1<-12:1
data1

Subsetting Data

Latihan 2

Dari data1 tersebut ambillah yang termasuk kelompok 1
indeks1 <- data1$Kel == 1
data2 <- data1[indeks1,]
data2

Latihan 3

Dari data1 tersebut ambillah yang termasuk kelompok 1 atau perlakuan P2
indeks2 <- data1$Kel == 1 | data1$Perl== "P2"
data3 <- data1[indeks2,]
data3

Latihan 4

Dari data1 tersebut ambillah amatan yang responnya berupa bilangan prima
indeks3 <- data1$Resp %in% c(2,3,5,7,11,13,17,19,23)
data4 <- data1[indeks3,]
data4

Sorting Data

Latihan 5

Urutkan data1 tersebut berdasarkan kelompok secara ascending
indeks4 <- order(data1$Kel)
data5 <- data1[indeks4,]
data5

Latihan 6

Urutkan data1 tersebut berdasarkan kelompok dan respon secara descending
indeks5 <- order(data1$Kel, data1$Resp, decreasing = TRUE )
data6 <- data1[indeks5, ]
data6

Latihan 7

Urutkan data1 tersebut berdasarkan kelompok secara ascending dan respon secara descending
indeks6 <- order(data1$Resp, decreasing = TRUE)
data7 <- data1[indeks6, ]

indeks7 <- order(data7$Kel)
data8 <- data7[indeks7, ]
data8
#Mengambil Peubah Respon pada data8
data8$Resp
##  [1] 19 13  7  1 21 15  9  3 23 17 11  5
#Mengurutkan peubah respon pada data8 secara asc
sort(data8$Resp)
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23
#Mengurutkan secara terbalik peubah Respon
rev(data8$Resp)
##  [1]  5 11 17 23  3  9 15 21  1  7 13 19
#Mengurutkan peubah respon secara ascending
order(data8$Resp)
##  [1]  4  8 12  3  7 11  2  6 10  1  5  9
#Mengurutkan data8 berdasarkan peubah respon
rank(data8$Resp)
##  [1] 10  7  4  1 11  8  5  2 12  9  6  3
#Mengambil nilai dari data8 yang peubah responnya >10
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

Latihan 8

Lakukanlah recoding pada data8 untuk variabel respon dengan kondisi jika respon<15 maka Code = 1, selainnya Code = 0
#dengan logical
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)
## Loading required package: carData
data8$Code3 <- recode(data8$Resp,'1:14=1; else=0')
data8

Merging Data

Latihan 9

Gabungkanlah data1 dengan tabel1 berdasarkan peubah pertamanya
tabel1 <- data.frame( Tr=c("P4","P2", "P5"), k1=c(50,100,200))
tabel1
#Berdasarkan urutan kolom dan yang dimunculkan yang memiliki value yang sama pada kedua kolom
data9<-merge(data1, tabel1, by.x=1, by.y=1, all=FALSE)
data9
#Berdasarkan nama kolom dan yang dimunculkan semua value baik yang memiliki kesaamaan ataupun tidak pada kedua kolom
data10<-merge(data1, tabel1,by.x="Perl",by.y="Tr",all=TRUE)
data10

Reshaping Data

Latihan 10

Ubahlah data1 menjadi data1 dengan setiap barisnya merupakan masing-masing perlakuan
#Long to Wide 
data11 <- reshape(data1[-4], idvar="Perl", timevar = "Kel", direction ="wide")
data11
#Wide to Long
data12 <- reshape(data11, idvar="Perl", timevar="Kel", direction="long")
data12

Manajemen Data Frame (Library Tidyverse)

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.4     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   2.0.1     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## x dplyr::recode() masks car::recode()
## x purrr::some()   masks car::some()
library(readxl)

Data Indeks Pembangunan Manusia

ipm <- read_xlsx("C:/ipm_metode_baru.xlsx",sheet="Provinsi",skip=3)
## New names:
## * `2010` -> `2010...3`
## * `2011` -> `2011...4`
## * `2012` -> `2012...5`
## * `2013` -> `2013...6`
## * `2014` -> `2014...7`
## * ...

Melihat isi dari data IPM

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 IPM tersebut akan diubah formatnya dari wide format ke dalam long format, sehingga perlu dilakukan reshaping data.
- 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 ...

Melihat 10 bariis pertama IPM yang sudah pada format long

# head(ipm1,n=10)
ipm1

Latihan 1

Mengambil data ipm yang hanya tahun 2018

ipm1 %>% filter(Tahun == 2018)

Latihan 2

Mengambil data komponen IPM tahun 2018.

ipm1 %>% filter(Tahun == 2018, Komponen == "IPM")

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

Latihan 4

Mengambil nilai IPM dari provinsi di Sumatera dan Jawa.(format long)

ipm1 %>% filter(Pulau %in% 1:3,Komponen == "IPM") %>% select(-Pulau, -Komponen)

Mengambil nilai IPM dari provinsi di Sumatera dan Jawa.(format wide)

ipm1 %>% filter(Pulau %in% 1:3,Komponen == "IPM") %>% select(-Pulau, -Komponen) %>%
pivot_wider(names_from = Tahun, values_from = Nilai)

Latihan 5

Mengambil data tahun 2017-2018 di pulau jawa dari semua komponen.(format long)

ipm1 %>% filter (Tahun %in% 2017:2018, Pulau ==3) %>% select(-Pulau)

Mengambil data tahun 2017-2018 di pulau jawa dari semua komponen.(format wide)

ipm1 %>% filter (Tahun %in% 2017:2018, Pulau ==3) %>% select(-Pulau) %>%
pivot_wider(names_from = c(Komponen,Tahun), values_from = Nilai)

Latihan 6

Menghitung rata-rata nilai per komponen per tahun.(format long)

ipm2 <- ipm1 %>% group_by(Komponen,Tahun) %>% summarise(rataan=mean(Nilai,na.rm=T)) 
## `summarise()` has grouped output by 'Komponen'. You can override using the `.groups` argument.
ipm2

Menghitung rata-rata nilai per komponen per tahun.(format wide)

ipm2 %>%
pivot_wider(names_from = Komponen, values_from = rataan)

Menjadikan data ipm pada kolom kompnen dalam 1 group

groups(ipm2)
## [[1]]
## Komponen

Penggunaan fungsi summarise pada groups akan menghasilkan yang sudah terkelompokkan sesuai dengan outputnya

ipm2 %>% summarise(rataan1=mean(rataan))
ipm3 <- ipm1 %>% group_by(Tahun,Komponen) %>% summarise(rataan=mean(Nilai,na.rm=T))
## `summarise()` has grouped output by 'Tahun'. You can override using the `.groups` argument.

sehingga perlu menggunakan argumen “groups”

groups(ipm3)
## [[1]]
## Tahun
ipm3 %>% summarise(rataan1=mean(rataan))

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("HLS", "IPM")) %>% 
  pivot_wider(names_from = "Komponen", values_from = "Nilai") %>%
    filter (IPM > 70) %>% select (Provinsi, HLS)
#alternatif 2
ipm1 %>% pivot_wider(names_from = "Komponen",values_from = "Nilai") %>% 
  filter(Tahun==2018,IPM>70) %>% select(Provinsi,HLS) #%>%  

Data Titanic

Menyiapkan datasets

Menggunakan data titanic_train dari package titanic

library(titanic)
data("titanic_train")
titanic_train <- tibble::as_tibble(titanic_train)
dim(titanic_train)
## [1] 891  12

Artinya pada data titanic_train terdapat 891 baris pengamatan dan 12 peubah

Melihat rangkuman datasets

head (titanic_train)
glimpse(titanic_train)
## Rows: 891
## Columns: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,~
## $ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1~
## $ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3~
## $ Name        <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl~
## $ Sex         <chr> "male", "female", "female", "female", "male", "male", "mal~
## $ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, ~
## $ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0~
## $ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0~
## $ Ticket      <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37~
## $ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,~
## $ Cabin       <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C~
## $ Embarked    <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"~

Melakukan Pengecekan apakah ada data NA

colSums(is.na(titanic_train))
## PassengerId    Survived      Pclass        Name         Sex         Age 
##           0           0           0           0           0         177 
##       SibSp       Parch      Ticket        Fare       Cabin    Embarked 
##           0           0           0           0           0           0

Terdapat data NA sebanyak 177 pada peubah Age

Menggunakan Fungsi select()

Mengambil subset peubah

titanic_train %>% select(PassengerId, Survived, Pclass, Name, Sex, Age)

Menggunakan Fungsi summarise()

Melihat rata rata usia penumpang berdasarkan kelas penumpang

summarise(titanic_train, mean(Age, na.rm=TRUE))

Melihat rata rata usia penumpang berdasarkan kelas penumpang

titanic_train %>% 
  group_by(Pclass) %>% 
  summarise(mean = mean(Age, na.rm = TRUE))

Menggunakan fungsi arrange()

Mengurutkan data berdasarkan Jenis Kelas Penumpang

 titanic_train %>% arrange(Pclass)

Menggunakan Fungsi filter()

Memilih data penumpang kelas 1 dan berjenis kelamin perempuan

titanic_train %>% filter(Pclass==1 & Sex=="female")

Menggunakan Fungsi mutate()

Menambah 1 variabel baru Class

titanic_train %>% mutate(Class = if_else(Pclass == 1 , "1stClass", if_else(Pclass == 2, "2ndClass", "3rdClass" )))

Menggunakan Fungsi Bersamaan

  1. Memilih peubah Survived, Kelas Penumpang, Nama, Sex, dan Usia dimana kelas penumpang = 2 dan Jenis Kelamin adalah Male
titanic_train %>% select(Survived, Pclass, Name, Sex, Age) %>%
filter (Pclass==2 & Sex == "male") %>%
arrange(Pclass)
  1. Assign variabel Data_Titanic
Data_Titanic <- titanic_train %>% mutate(Class = if_else(Pclass == 1 , "1stClass", if_else(Pclass == 2, "2ndClass", "3rdClass" )))
  1. Memilih data kelas penumpang dan berjenis kelamin perempuan disusun berdasarkan Pclass
titanic_train %>% 
  select(Pclass, Sex) %>% filter(Sex=="female") %>% arrange(Pclass)
  1. Memilih data kelas penumpang dan berjenis kelamin laki-laki disusun berdasarkan Pclass
titanic_train %>% 
  select(Pclass, Sex) %>% filter(Sex=="male") %>% arrange(Pclass)

5.Memilih peubah Survived, Kelas Penumpang, Nama, Sex, dan Usia dengan Jenis Kelamin adalah Male

titanic_train %>% select(Survived, Pclass, Name, Sex, Age) %>%
filter (Sex == "male") %>%
arrange(Pclass)

6.Memilih peubah Survived, Kelas Penumpang, Nama, Sex, dan Usia dimana statusnya adalah Survived

titanic_train %>% select(Survived, Pclass, Name, Sex, Age) %>%
filter (Survived==1) %>%
arrange(Pclass)
  1. Memilih peubah Survived, Kelas Penumpang, Nama, Sex, dan Usia dimana statusnya adalah Not Survived
titanic_train %>% select(Survived, Pclass, Name, Sex, Age) %>%
filter (Survived==0) %>%
arrange(Pclass)