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')
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)
Gunakan head
dan tail
untuk menampilkan n
baris teratas dan terbawah
head(datakab, n = 3)
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] |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12012 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Other (in % of total villages) | ROD.VILG.OTHR.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12013 | |||||||||||||||||||
12014 | |||||||||||||||||||
12015 | |||||||||||||||||||
12016 | Data from database: INDO-DAPOER (Indonesia Database for Policy and Economic Research) | ||||||||||||||||||
12017 | Last 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 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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12011 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | Yogyakarta, 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 librarymagrittr
.f() %>% g()
berarti output dari fungsif
akan menjadi argumen pertama dari fungsig
library(magrittr)
datakab[-12013:-12017,] %>% tail(3)
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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12010 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Dirt (in % of total villages) | ROD.VILG.DIRT.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12011 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | Yogyakarta, 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/variabelSeries Code
yang merupakan komponen dari tabeldatakab
- nama variabel perlu diapit dengan backtick (```) hanya jika mengandung spasi
which(datakab$`Series Code` != "") %>% datakab[.,] %>% tail(2)
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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12011 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | Yogyakarta, 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 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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12011 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | Yogyakarta, 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` != "")
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 Name | Series Name | Series Code | 2000 [YR2000] | 2014 [YR2014] | |
---|---|---|---|---|---|
12009 | Yogyakarta, Kota | Villages with road: Asphalt (in % of total villages) | ROD.VILG.ASPH.ZS | 100 | .. |
12010 | Yogyakarta, Kota | Villages with road: Dirt (in % of total villages) | ROD.VILG.DIRT.ZS | .. | .. |
12011 | Yogyakarta, Kota | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. |
12012 | Yogyakarta, 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 Code | Series Name | |
---|---|---|
12007 | IDN_Yogyakarta_Kota_17983 | Total GDP based on expenditure (in IDR Million) |
12008 | IDN_Yogyakarta_Kota_17983 | Total Population (in number of people) |
12009 | IDN_Yogyakarta_Kota_17983 | Villages with road: Asphalt (in % of total villages) |
12010 | IDN_Yogyakarta_Kota_17983 | Villages with road: Dirt (in % of total villages) |
12011 | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) |
12012 | IDN_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-fungsidplyr
. Fungsidplyr
itu sendiri akan berjalan baik, tapi penggunaan fungsi yang ditutupi kini perlu menyertakan prefix package asalnya.
library(dplyr)
Attaching package: 'dplyr' The following objects are masked from 'package:stats': filter, lag The following objects are masked from 'package:base': intersect, setdiff, setequal, union
Berapa ketentuan dalam pemilihan variabel di fungsi select
:
var_kiri:var_kanan
starts_with
), diakhiri (ends_with
), atau mengandung (contains
) karakter tertentu-
) untuk mengecualikan variabelselect
nama_baru = nama_lama
select(datakab, 'Region Code':'Series Code', -'Series Name',
region_name = 'Region Name', contains('YR'), -contains('YR201')) %>% tail(4)
Region Code | Series Code | region_name | 2000 [YR2000] | 2001 [YR2001] | 2002 [YR2002] | 2003 [YR2003] | 2004 [YR2004] | 2005 [YR2005] | 2006 [YR2006] | 2007 [YR2007] | 2008 [YR2008] | 2009 [YR2009] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12009 | IDN_Yogyakarta_Kota_17983 | ROD.VILG.ASPH.ZS | Yogyakarta, Kota | 100 | .. | .. | 100 | .. | 100 | .. | .. | 100 | .. |
12010 | IDN_Yogyakarta_Kota_17983 | ROD.VILG.DIRT.ZS | Yogyakarta, Kota | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12011 | IDN_Yogyakarta_Kota_17983 | ROD.VILG.GRAVL.ZS | Yogyakarta, Kota | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | IDN_Yogyakarta_Kota_17983 | ROD.VILG.OTHR.ZS | Yogyakarta, Kota | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
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_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] | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 | Aceh Selatan, Kab. | IDN_Aceh_Selatan_Kab_73626 | Number of schools at primary level | SE.SCHL.PRM | 333 | .. | .. | 211 | .. | 223 | .. | .. | 128 | .. | .. | 232 | .. | .. | .. |
101 | Aceh Selatan, Kab. | IDN_Aceh_Selatan_Kab_73626 | Number of schools at Senior Secondary level | SE.SCHL.SRSEC | 25 | .. | .. | 21 | .. | 25 | .. | .. | 15 | .. | .. | 40 | .. | .. | .. |
102 | Aceh 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_yr2000 | x2001_yr2001 | x2002_yr2002 | x2003_yr2003 | x2004_yr2004 | x2005_yr2005 | x2006_yr2006 | x2007_yr2007 | x2008_yr2008 | x2009_yr2009 | x2010_yr2010 | x2011_yr2011 | x2012_yr2012 | x2013_yr2013 | x2014_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_name | region_code | series_name | series_code | yr2000 | yr2001 | yr2002 | yr2003 | yr2004 | yr2005 | yr2006 | yr2007 | yr2008 | yr2009 | yr2010 | yr2011 | yr2012 | yr2013 | yr2014 |
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_name | region_code | series_name | series_code | yr2010 | yr2011 | yr2012 | yr2013 | yr2014 |
data2 = datakab %>% select(-contains('201'))
names(data2) %>% t
region_name | region_code | series_name | series_code | yr2000 | 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_code | series_code | region_name.x | series_name.x | yr2010 | yr2011 | yr2012 | yr2013 | yr2014 | region_name.y | ... | yr2000 | yr2001 | yr2002 | yr2003 | yr2004 | yr2005 | yr2006 | yr2007 | yr2008 | yr2009 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12010 | IDN_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 |
12011 | IDN_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 |
12012 | IDN_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)
Joining, by = c("region_name", "region_code", "series_name", "series_code")
region_name | region_code | series_name | series_code | yr2010 | yr2011 | yr2012 | yr2013 | yr2014 | yr2000 | yr2001 | yr2002 | yr2003 | yr2004 | yr2005 | yr2006 | yr2007 | yr2008 | yr2009 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12010 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Dirt (in % of total villages) | ROD.VILG.DIRT.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12011 | Yogyakarta, Kota | IDN_Yogyakarta_Kota_17983 | Villages with road: Gravel (in % of total villages) | ROD.VILG.GRAVL.ZS | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. | .. |
12012 | Yogyakarta, 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
all.x = TRUE
, ekuivalen dengan dplyr::left_join
all.y = TRUE
, ekuivalen dengan dplyr::right_join
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)
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 packagesummarytools
menampilkan ringkasan karakteristik data. Argumengraph.col = F
digunakan karena informasi pada histogram sudah diwakili oleh kolom frekuensiFreqs
. Demikian pulana.col
yang mengandung jumlah dan persentase missing values adalah kebalikan dari kolomValid
.
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) ------------------------------------------------------------------------------------------
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_name | region_code | year | Human Development Index | Morbidity Rate (in %) | Net Enrollment Ratio: Junior Secondary (in %) | Net Enrollment Ratio: Primary (in %) | Net Enrollment Ratio: Senior Secondary (in %) | Number of Doctors | Number of hospitals | ... | Number of schools at Senior Secondary level | Poverty 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_73623 | 2000 | 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_73623 | 2001 | 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
danstr_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_level | poverty_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 |
save.image
save
jika hanya sebagian objek yang ingin disimpan.RData
jika ingin otomatis dimuat ke memori tiap awal menjalankan R dari direktori tersebutsave.image(file = ".RData")
save(datakab, file = "datakab.rda")
rm
rm(data1, data2)
ls()
ls
memberikan vektor nama semua objek yang ada di memorirm(list = ls())
ls()
load
untuk memuat semua objek dalam file image ke memorisaveRDS
dan muat dengan readRDS
load('datakab.rda')
ls()
saveRDS(datakab, file = "datakab.rds")
indodapoer = readRDS('datakab.rds')
ls()