Menyiapkan Data

Pekerjaan Di Balik Layar

  • Menyiapkan data (data cleaning) sering menjadi pekerjaan paling memakan waktu
  • Metode menyiapkan data jarang diajarkan dalam kelas
  • Padahal kesalahan dalam menyiapkan data bisa mengubah hasil analisis

Memuat data dari file ke R

Dengan library rio, kita bisa mengimpor ke R data dari berbagai macam format: txt, csv, xls, xlsx, dbf, sav, dta, sas7.bdat. Data yang diimpor akan menjadi obyek R tipe data.frame.

Install dulu package rio jika belum pernah diinstal sebelumnya. Muat package tersebut dengan perintah library

# install.packages('rio')
library(rio)
datakab = import('https://raw.githubusercontent.com/msaidf/statek/master/content/indo-dapoer_data.csv')

Mengecek Data

Tampilkan keseluruhan data dengan mengenter nama obyek data. Namun untuk data yang besar, ini tidak banyak membantu bahkan bisa makan waktu lama.

datakab

Perlu dibiasakan untuk mengecek dulu jumlah baris dari tabel data

nrow(datakab)

12017


Gunakan head dan tail untuk menampilkan n baris teratas dan terbawah

head(datakab, n = 3)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
Aceh Barat Daya, Kab. IDN_Aceh_Barat_Daya_Kab_73623 Human Development Index IDX.HDI .. .. .. .. 65.87778 66.86649 67.52173 68.36661 69.38033 .. .. 70.95 .. 72.07 ..
Aceh Barat Daya, Kab. IDN_Aceh_Barat_Daya_Kab_73623 Morbidity Rate (in %) SH.MORB.ZS .. .. .. .. 29.19532 .. 33.22042 35.90795 31.811 29.2377 30.0167 33.93033 30.5736273527145 29.909548163414 ..
Aceh Barat Daya, Kab. IDN_Aceh_Barat_Daya_Kab_73623 Net Enrollment Ratio: Primary (in %)SE.PRM.NENR.ZS .. .. .. .. 94.65 .. 94.89 94.34 96.21 96.55 98.32 86.16 90.96 95.395058 97.03


n adalah argumen opsional

tail(datakab)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12013
12014
12015
12016Data from database: INDO-DAPOER (Indonesia Database for Policy and Economic Research)
12017Last Updated: 05/28/2015


Lima baris terakhir tabel bukan merupakan data, sehingga perlu kita keluarkan. Kita bisa gunakan indeks positif untuk memilih baris yang dipertahankan,

tail(datakab[1:12012,], 2)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
12011Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)ROD.VILG.GRAVL.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..


atau gunakan indeks negatif untuk memilih baris yang dibuang.

R memproses fungsi dari dalam ke luar. Namun penulisan seperti ini sulit dibaca dan diikuti urutan prosesnya. Karenanya, kini pemrograman R banyak menggunakan operator piping %>% dari library magrittr. f() %>% g() berarti output dari fungsi f akan menjadi argumen pertama dari fungsi g

library(magrittr)
datakab[-12013:-12017,] %>% tail(3)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
12010Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Dirt (in % of total villages) ROD.VILG.DIRT.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12011Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)ROD.VILG.GRAVL.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..


Subset juga bisa dibuat dengan memfilter tabel data agar hanya memberikan baris yang nilai variabelnya memenuhi kriteria yang ditetapkan. Kita bisa gunakan fungsi which untuk menghasilkan indeks baris yang memenuhi kriteria tersebut.

  • Tanda titik dalam fungsi subset [.,] digunakan untuk memandu operator pipe bahwa input dari fungsi sebelumnya menjadi argumen di lokasi titik tersebut
  • $ digunakan untuk memilih kolom/variabel Series Code yang merupakan komponen dari tabel datakab
  • nama variabel perlu diapit dengan backtick (```) hanya jika mengandung spasi
which(datakab$`Series Code` != "") %>% datakab[.,] %>% tail(2)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
12011Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)ROD.VILG.GRAVL.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..


Cara lain untuk memilih baris berdasar kriteria adalah menggunakan fungsi filter dari library dplyr.

  • Kita bisa menggunakan fungsi dari suatu library tanpa memuatnya terlebih dulu dengan menggunakan ::
  • Bandingkan hasil perintah di bawah jika dijalankan tanpa awalan dplyr::
  • Perbedaan tersebut terjadi karena fungsi filter yang digunakan berasal dari package lain
  • Jika ada lebih dari satu fungsi yang bernama sama, R akan memprioritaskan fungsi dari library yang dimuat paling akhir.
dplyr::filter(datakab, `Series Code` != "")  %>% tail(2)

Region NameRegion CodeSeries NameSeries Code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
12011Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)ROD.VILG.GRAVL.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..


Jika sudah yakin indeks menghasilkan subset yang diinginkan, simpan subset tersebut menjadi objek. Jangan sertakan tail karena yang ingin disimpan adalah keseluruhan data, bukan cuma baris terbawah saja.

datakab = dplyr::filter(datakab, `Series Code` != "") 

Memilih variabel

Seperti memilih baris, kita bisa memilih variabel menggunakan indeks kolom yang terletak setelah koma di fungsi subset []

c(1, 3:5, ncol(datakab)) %>% datakab[, .] %>% tail(4)

Region NameSeries NameSeries Code2000 [YR2000]2014 [YR2014]
12009Yogyakarta, Kota Villages with road: Asphalt (in % of total villages)ROD.VILG.ASPH.ZS 100 ..
12010Yogyakarta, Kota Villages with road: Dirt (in % of total villages) ROD.VILG.DIRT.ZS .. ..
12011Yogyakarta, Kota Villages with road: Gravel (in % of total villages) ROD.VILG.GRAVL.ZS .. ..
12012Yogyakarta, Kota Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. ..


Indeks kolom angka bisa digantikan dengan vektor nama variabel

datakab[,c('Region Code', 'Series Name')] %>% tail

Region CodeSeries Name
12007IDN_Yogyakarta_Kota_17983 Total GDP based on expenditure (in IDR Million)
12008IDN_Yogyakarta_Kota_17983 Total Population (in number of people)
12009IDN_Yogyakarta_Kota_17983 Villages with road: Asphalt (in % of total villages)
12010IDN_Yogyakarta_Kota_17983 Villages with road: Dirt (in % of total villages)
12011IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)
12012IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages)


Pemilihan variabel juga bisa menggunakan dplyr::select. Namun kali ini lebih baik dplyr dimuat dulu agar semua fungsi pembantunya bisa ikut digunakan.

Ketika memuat dplyr akan ada pesan peringatan fungsi-fungsi dari package lain yang ditutupi oleh fungsi-fungsi dplyr. Fungsi dplyr itu sendiri akan berjalan baik, tapi penggunaan fungsi yang ditutupi kini perlu menyertakan prefix package asalnya.

library(dplyr)

Berapa ketentuan dalam pemilihan variabel di fungsi select:

  • Nama variabel yang mengandung spasi harus diapit tanda kutip
  • Pilih sejumlah variabel yang berurutan cukup sebutkan variabel di pinggir, var_kiri:var_kanan
  • Pilih semua variabel yang namanya memiliki kesamaan pola, baik diawali (starts_with), diakhiri (ends_with), atau mengandung (contains) karakter tertentu
  • Gunakan tanda minus (-) untuk mengecualikan variabel
  • Urutan kolom tabel baru mengikuti urutan variabel dalam select
  • Mengganti nama variabel yang dipilih, nama_baru = nama_lama
select(datakab, 'Region Code':'Series Code', -'Series Name', 
       region_name = 'Region Name', contains('YR'), -contains('YR201')) %>% tail(4)

Region CodeSeries Coderegion_name2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]
12009IDN_Yogyakarta_Kota_17983ROD.VILG.ASPH.ZS Yogyakarta, Kota 100 .. .. 100 .. 100 .. .. 100 ..
12010IDN_Yogyakarta_Kota_17983ROD.VILG.DIRT.ZS Yogyakarta, Kota .. .. .. .. .. .. .. .. .. ..
12011IDN_Yogyakarta_Kota_17983ROD.VILG.GRAVL.ZS Yogyakarta, Kota .. .. .. .. .. .. .. .. .. ..
12012IDN_Yogyakarta_Kota_17983ROD.VILG.OTHR.ZS Yogyakarta, Kota .. .. .. .. .. .. .. .. .. ..

Merubah Nama Variabel

Jika hanya ingin mengganti nama sejumlah variabel, tanpa merubah struktur tabel data, gunakan dplyr::rename

hasil dari rename adalah tabel data, sehingga bisa langsung disubset dengan [] tanpa menggunakan piping %>%

rename(datakab, region_name = 'Region Name', series_code = 'Series Code') [100:102,]

region_nameRegion CodeSeries Nameseries_code2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]
100Aceh Selatan, Kab. IDN_Aceh_Selatan_Kab_73626 Number of schools at primary level SE.SCHL.PRM 333 .. .. 211 .. 223 .. .. 128 .. .. 232 .. .. ..
101Aceh Selatan, Kab. IDN_Aceh_Selatan_Kab_73626 Number of schools at Senior Secondary levelSE.SCHL.SRSEC 25 .. .. 21 .. 25 .. .. 15 .. .. 40 .. .. ..
102Aceh Selatan, Kab. IDN_Aceh_Selatan_Kab_73626 Poverty Line (in IDR) SI.POV.NAPL .. .. .. .. .. 171815 186227 196167 203761 236741 257640 278854 281158 283446 285301


Merubah nama bisa pula dilakukan dengan meng-assign vektor nama baru dengan panjang sama seperti nama yang hendak digantikan

names(datakab)[1:3] = names(datakab)[1:3] %>% toupper
names(datakab) %>% t

REGION NAME REGION CODE SERIES NAME Series Code 2000 [YR2000]2001 [YR2001]2002 [YR2002]2003 [YR2003]2004 [YR2004]2005 [YR2005]2006 [YR2006]2007 [YR2007]2008 [YR2008]2009 [YR2009]2010 [YR2010]2011 [YR2011]2012 [YR2012]2013 [YR2013]2014 [YR2014]

Format penulisan nama-nama variabel di atas akan mempersulit penulisan program selanjutnya. Fungsi clean_names dari package janitor bisa merubah sekaligus seluruh nama variabel dalam data agar mengikuti gaya penulisan nama variabel yang banyak disarankan.

datakab = janitor::clean_names(datakab)
names(datakab) %>% t

region_name region_code series_name series_code x2000_yr2000x2001_yr2001x2002_yr2002x2003_yr2003x2004_yr2004x2005_yr2005x2006_yr2006x2007_yr2007x2008_yr2008x2009_yr2009x2010_yr2010x2011_yr2011x2012_yr2012x2013_yr2013x2014_yr2014

Kita bisa sederhanakan lagi nama-nama variabel tahun dengan hanya mengambil karakter setelah garis bawah ( _ ). Kita gunakan fungsi str_replace dari library stringr untuk mendeteksi pola karakter yang ingin dihapus, yakni diganti dengan karakter kosong ('')

datakab %<>% rename_at(vars(starts_with('x20')), 
                       funs(stringr::str_replace(., 'x20[0-9][0-9]_', ''))) 
datakab %>% names %>% t

region_nameregion_codeseries_nameseries_codeyr2000 yr2001 yr2002 yr2003 yr2004 yr2005 yr2006 yr2007 yr2008 yr2009 yr2010 yr2011 yr2012 yr2013 yr2014

Menggabungkan data

Untuk keperluan latihan penggabungan, datakab dipecah menjadi dua data dengan variabel berbeda kecuali variabel ID

data1 = datakab %>% select(region_name:series_code, contains('201'))
names(data1) %>% t

region_nameregion_codeseries_nameseries_codeyr2010 yr2011 yr2012 yr2013 yr2014
data2 = datakab %>% select(-contains('201'))
names(data2) %>% t

region_nameregion_codeseries_nameseries_codeyr2000 yr2001 yr2002 yr2003 yr2004 yr2005 yr2006 yr2007 yr2008 yr2009


Lalu gabungkan dua data tersebut menggunakan merge dari base R, atau seri fungsi _join dari dplyr. Penggabungan baris berdasar variabel ID dalam argumen by. Jika ada variabel bernama sama tapi tidak menjadi argumen by, maka di data baru variabel tersebut akan ditambahi akhiran .x dan .y

merge(data1, data2, by = c('region_code', 'series_code')) %>% tail(3)

region_codeseries_coderegion_name.xseries_name.xyr2010yr2011yr2012yr2013yr2014region_name.y...yr2000yr2001yr2002yr2003yr2004yr2005yr2006yr2007yr2008yr2009
12010IDN_Yogyakarta_Kota_17983 SI.POV.NAPR.ZS Yogyakarta, Kota Poverty Rate (in % of population) 9.75 9.62 9.38 8.82 8.67 Yogyakarta, Kota ... .. .. 14.52 12.59 21.77 10.5 10.22 9.78 10.81 10.05
12011IDN_Yogyakarta_Kota_17983 SI.POV.NGAP Yogyakarta, Kota Poverty Gap (index) 1.29 1.19 1.57 1.24 1.14 Yogyakarta, Kota ... .. .. 3.23 3.23 2.96 2.34 1.88 2.26 2.1 1.91
12012IDN_Yogyakarta_Kota_17983 SP.POP.TOTL Yogyakarta, Kota Total Population (in number of people)388627 392506 397594 402679 .. Yogyakarta, Kota ... 397398 395775 394140 392492 396238 419163.765233477 445258 451118 456915 462663


Jika variabel id berbeda nama di kedua data, pasangkan variabel id dari kedua data dengan tanda =, dengan format

by = c("ID1_data1" = "ID1_data2", "ID2_data1" = "ID2_data2")

Jika tidak ada argumen by, penggabungan dilakukan dengan semua variabel bernama sama

dplyr::inner_join(data1, data2) %>% tail(3)

region_nameregion_codeseries_nameseries_codeyr2010yr2011yr2012yr2013yr2014yr2000yr2001yr2002yr2003yr2004yr2005yr2006yr2007yr2008yr2009
12010Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Dirt (in % of total villages) ROD.VILG.DIRT.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12011Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Gravel (in % of total villages)ROD.VILG.GRAVL.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12012Yogyakarta, Kota IDN_Yogyakarta_Kota_17983 Villages with road: Other (in % of total villages) ROD.VILG.OTHR.ZS .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..

Secara default, hasil merge hanya mempertahankan baris dengan ID yang terdapat di kedua data yang digabungkan. Hasil default merge ini ekuivalen dengan hasil dari dplyr::inner_join

Jika ingin semua baris dipertahankan walau ID hanya terdapat di salah satu data, maka gunakan argumen all = TRUE. Ini ekuivalen dengan hasil dari dplyr::all_join

Jika hanya ingin mempertahankan semua baris dari salah satu data

  • data I gunakan all.x = TRUE, ekuivalen dengan dplyr::left_join
  • data II gunakan all.y = TRUE, ekuivalen dengan dplyr::right_join

Merubah Nilai

Data dalam tabel bisa dirubah dengan meng-assign nilai baru ke lokasi baris dan kolom yang ingin dirubah. Dimensi nilai yang di-assign harus sama dengan dimensi data yang dirubah. Berikut ini data di baris kedua dan kolom kelima datakab diganti dari karakter “..” menjadi NA

NA, kependekan dari Not Available, adalah cara R mengeksplisitkan bagian data yang tidak memiliki nilai (missing values). Sel yang tampak kosong di R adalah karakter kosong yang dianggap ada datanya, yakni observasi yang valid.

datakab[2,5]

'..'
(datakab[2,5] = NA)

<NA>

Di bawah ini bisa dilihat bahwa variabel-variabel tahun didominasi dengan karakter “..” yang sebenarnya mewakili missing values. Karena di atas kita telah mengganti satu observasi menjadi NA dalam kolom ke-5 data, yakni variabel yr2000, maka variabel tersebut tidak lagi valid 100%.

dfSummary dari package summarytools menampilkan ringkasan karakteristik data. Argumen graph.col = F digunakan karena informasi pada histogram sudah diwakili oleh kolom frekuensi Freqs. Demikian pula na.col yang mengandung jumlah dan persentase missing values adalah kebalikan dari kolom Valid.

datakab %>% select(yr2000, yr2001) %>% 
            summarytools::dfSummary(graph.col = F, na.col = F) %>% 
            print

Data Frame Summary     
N: 12012   
--------------------------------------------------------------------
No   Variable      Stats / Values    Freqs (% of Valid)   Valid     
---- ------------- ----------------- -------------------- ----------
1    yr2000        1. ..             7343 (61.1%)         12011     
     [character]   2. 1              85 ( 0.7%)           (99.99%)  
                   3. 2              79 ( 0.7%)                     
                   4. 4              49 ( 0.4%)                     
                   5. 3              47 ( 0.4%)                     
                   6. 100            31 ( 0.3%)                     
                   7. 5              26 ( 0.2%)                     
                   8. 7              21 ( 0.2%)                     
                   9. 6              20 ( 0.2%)                     
                   10. 26            18 ( 0.1%)                     
                   [ 2901 others ]   4292 (40.2%)                   

2    yr2001        1. ..             10189 (84.8%)        12012     
     [character]   2. 94.52          4 ( 0.0%)            (100%)    
                   3. 90.77          3 ( 0.0%)                      
                   4. 90.92          3 ( 0.0%)                      
                   5. 92.16          3 ( 0.0%)                      
                   6. 93.44          3 ( 0.0%)                      
                   7. 93.53          3 ( 0.0%)                      
                   8. 93.58          3 ( 0.0%)                      
                   9. 93.69          3 ( 0.0%)                      
                   10. 94.03         3 ( 0.0%)                      
                   [ 1724 others ]   1795 (17.9%)                   
--------------------------------------------------------------------

Salah satu unsur penyiapan data untuk analisis adalah mengeksplisitkan seluruh missing values pada data menjadi NA agar diproses secara benar dalam analisis berikutnya. Untuk keperluan ini, kombinasi dplyr::mutate dan ifelse bisa digunakan untuk merubah seluruh nilai variabel “..” menjadi NA.

ifelse akan memberikan nilai argumen kedua jika ekspresi di argumen pertamanya benar, dan memberikan nilai argumen ketiga jika ekspresi tersebut salah. Uji kesamaan di R menggunakan simbol ==, bukan =. Ketidaksamaan menggunakan simbol !=. Sementara relasi lainnya menggunakan simbol matematika seperti umumnya, <, >, <=, dan >=.

datakab %>% mutate(yr2000 = ifelse(yr2000 == '..', NA, yr2000),
                   yr2001 = ifelse(yr2001 == '..', NA, yr2001)) %>% 
            select(yr2000:yr2002) %>% 
            summarytools::dfSummary(graph.col = F, na.col = F) %>% 
            print

Data Frame Summary     
N: 12012   
--------------------------------------------------------------------
No   Variable      Stats / Values    Freqs (% of Valid)   Valid     
---- ------------- ----------------- -------------------- ----------
1    yr2000        1. 1              85 ( 1.8%)           4668      
     [character]   2. 2              79 ( 1.7%)           (38.86%)  
                   3. 4              49 ( 1.0%)                     
                   4. 3              47 ( 1.0%)                     
                   5. 100            31 ( 0.7%)                     
                   6. 5              26 ( 0.6%)                     
                   7. 7              21 ( 0.4%)                     
                   8. 6              20 ( 0.4%)                     
                   9. 26             18 ( 0.4%)                     
                   10. 11            17 ( 0.4%)                     
                   [ 2900 others ]   4275 (87.3%)                   

2    yr2001        1. 94.52          4 ( 0.2%)            1823      
     [character]   2. 90.77          3 ( 0.2%)            (15.18%)  
                   3. 90.92          3 ( 0.2%)                      
                   4. 92.16          3 ( 0.2%)                      
                   5. 93.44          3 ( 0.2%)                      
                   6. 93.53          3 ( 0.2%)                      
                   7. 93.58          3 ( 0.2%)                      
                   8. 93.69          3 ( 0.2%)                      
                   9. 94.03          3 ( 0.2%)                      
                   10. 94.07         3 ( 0.2%)                      
                   [ 1723 others ]   1792 (90.3%)                   

3    yr2002        1. ..             9487 (79.0%)         12012     
     [character]   2. 4.34           5 ( 0.0%)            (100%)    
                   3. 2.19           4 ( 0.0%)                      
                   4. 2.33           4 ( 0.0%)                      
                   5. 2.34           4 ( 0.0%)                      
                   6. 2.53           4 ( 0.0%)                      
                   7. 0.65           3 ( 0.0%)                      
                   8. 0.86           3 ( 0.0%)                      
                   9. 0.97           3 ( 0.0%)                      
                   10. 0.98          3 ( 0.0%)                      
                   [ 2273 others ]   2492 (24.7%)                   
--------------------------------------------------------------------

Gunakan mutate_at untuk memutasi sekaligus semua variabel yang dipilih dengan fungsi yang sama, tanpa harus mengulang satu per satu. Agar perintah mutasi bisa diterapkan ke semua variabel, nama variabel diganti dengan titik (.) dalam argumen funs

datakab %<>% mutate_at(vars(starts_with("yr20")), funs(ifelse(. == '..', NA, .))) 

Data pada variabel-variabel yang diawali yr pada dasarnya merupakan variabel angka, sehingga lebih baik dikonversi menjadi tipe angka dengan as.numeric.

datakab %<>% mutate_at(vars(starts_with("yr20")), as.numeric)

dfSummary kini dapat menyajikan statitik yang meringkas variabel angka, bukan hanya frekuensi tiap nilai uniknya.

datakab %>% select(starts_with("yr201")) %>%
            summarytools::dfSummary(graph.col = F, na.col = F) %>% 
            print

Data Frame Summary     
N: 12012   
------------------------------------------------------------------------------------------
No   Variable    Stats / Values                          Freqs (% of Valid)     Valid     
---- ----------- --------------------------------------- ---------------------- ----------
1    yr2010      mean (sd) : 1360005.99 (24387637.53)    3776 distinct values   4305      
     [numeric]   min < med < max :                                              (35.84%)  
                 0.19 < 59.02 < 862158976                                                 
                 IQR (CV) : 42791.39 (17.93)                                              

2    yr2011      mean (sd) : 329813.33 (11716890.33)     5981 distinct values   10396     
     [numeric]   min < med < max :                                              (86.55%)  
                 0 < 57 < 982540032                                                       
                 IQR (CV) : 80.45 (35.53)                                                 

3    yr2012      mean (sd) : 150075.75 (1148162.6)       3720 distinct values   4273      
     [numeric]   min < med < max :                                              (35.57%)  
                 0 < 61.9 < 44643586                                                      
                 IQR (CV) : 78.08 (7.65)                                                  

4    yr2013      mean (sd) : 137749.78 (1099946.11)      4373 distinct values   4778      
     [numeric]   min < med < max :                                              (39.78%)  
                 0 < 69.12 < 45340799                                                     
                 IQR (CV) : 74.97 (7.99)                                                  

5    yr2014      mean (sd) : 52560.86 (120968.25)        2582 distinct values   3180      
     [numeric]   min < med < max :                                              (26.47%)  
                 0.2 < 68.97 < 657702                                                     
                 IQR (CV) : 85.91 (2.3)                                                   
------------------------------------------------------------------------------------------

Pivot Tabel

  • Tahun pada dasarnya bukan nama variabel, sehingga bisa dikumpulkan menjadi satu kolom/variabel dengan menggunakan dplyr::gather
datakab %<>% gather(year, val, starts_with('yr'))  
datakab %>% head(2)

Kolom series_code dan series_name sebenarnya berisikan nama-nama variabel. Agar data rapi, siap analisis, nama-nama variabel dalam kolom tersebut perlu dijadikan sebagai nama kolom.

dplyr::spread bisa digunakan untuk keperluan ini. Dalam menerapkannya, salah satu dari series_code atau series_name perlu dibuang dulu karena redundan dan justru membuat hasilnya tak sesuai harapan.

datakab %<>% mutate(year = str_replace(year, 'yr', '') %>% 
                          as.integer) %>% 
            select(-series_code) %>% 
            spread(key = series_name, value = val)
datakab %>% head(2)

region_nameregion_codeyearHuman Development IndexMorbidity Rate (in %)Net Enrollment Ratio: Junior Secondary (in %)Net Enrollment Ratio: Primary (in %)Net Enrollment Ratio: Senior Secondary (in %)Number of DoctorsNumber of hospitals...Number of schools at Senior Secondary levelPoverty Gap (index)Poverty Line (in IDR)Poverty Rate (in % of population)Total GDP based on expenditure (in IDR Million)Total Population (in number of people)Villages with road: Asphalt (in % of total villages)Villages with road: Dirt (in % of total villages)Villages with road: Gravel (in % of total villages)Villages with road: Other (in % of total villages)
Aceh Barat Daya, Kab. IDN_Aceh_Barat_Daya_Kab_736232000 NA NA NA NA NA NA NA ... NA NA NA NA NA NA NA NA NA NA
Aceh Barat Daya, Kab. IDN_Aceh_Barat_Daya_Kab_736232001 NA NA NA NA NA NA NA ... NA NA NA NA NA NA NA NA NA NA

Nama kolom-kolom baru ini tidak memenuhi gaya standar. janitor::clean_names bisa digunakan lagi untuk menstandarisasi nama. Dan sekedar untuk menyingkat nama variabel, bagian nama yang menjelaskan unit pengukuran bisa dihapus dengan bantuan fungsi str_replace_all dari library stringr.

str_replace dan str_detect mencari urutan karakter yang memenuhi pola yang dispesifikasi menggunakan syntax regular expression.

datakab %<>% janitor::clean_names()
names(datakab) %<>% str_replace_all('_in_.+$', '') %>% t
datakab %>% names %>% t

region_name region_code year human_development_index morbidity_rate net_enrollment_ratio_junior_secondary net_enrollment_ratio_primary net_enrollment_ratio_senior_secondary number_of_doctors number_of_hospitals ... number_of_schools_at_senior_secondary_levelpoverty_gap_index poverty_line poverty_rate total_gdp_based_on_expenditure total_population villages_with_road_asphalt villages_with_road_dirt villages_with_road_gravel villages_with_road_other

Menyimpan dan Menghapus Objek

  • simpan semua objek R di memori ke file dengan perintah save.image
  • gunakan save jika hanya sebagian objek yang ingin disimpan
  • simpan image dengan nama .RData jika ingin otomatis dimuat ke memori tiap awal menjalankan R dari direktori tersebut
save.image(file = ".RData")
save(datakab, file = "datakab.rda")

  • hapus objek R dari memori dengan rm
rm(data1, data2)
ls()

'datakab'
  • ls memberikan vektor nama semua objek yang ada di memori
rm(list = ls())
ls()

  • gunakan load untuk memuat semua objek dalam file image ke memori

  • saat dimuat kembali dari file image, nama objek akan sama dengan saat disimpan
  • untuk bisa bebas memberikan nama baru pada objek saat dimuat kembali, simpan dengan saveRDS dan muat dengan readRDS
  • kedua perintah ini hanya bisa menyimpan dan memuat satu objek
load('datakab.rda')
ls()

'datakab'
saveRDS(datakab, file = "datakab.rds")
indodapoer = readRDS('datakab.rds')
ls()

<ol class=list-inline>
  • 'datakab'
  • 'indodapoer'
  • </ol>