Siang tadi saya coba untuk perlahan-lahan mengumpulkan data yang saya miliki di laptop untuk disimpan di satu tempat. Supaya terorganisir.
Karena sebelumnya saya menonton video dari Youtube-nya Mas Aswan, jadi saya pakai bantuan library pins
(baru dari RStudio) untuk mengelola koleksi dataset di github.
Malam ini saya coba mengunggah data gempa yang sudah lama terbengkalai. Bulukan di direktori ~/Downloads
.
Datanya ada 9 files dengan format csv
. Untuk bisa mengunggahnya saya harus ubah jadi format rds
. PR nih~
Tapi jangan khawatir. Saya mau belajar!
Saya pakai iterasi untuk impor berkas csv
, menggunakan fungsi map_dfr()
dari library purrr
sesuai Youtube-nya Mas Aswan lagi. Supaya cuma satu kali kerja. Juga dengan bantuan fungsi dir_ls()
dari library fs
untuk mendaftar lokasi dan nama berkas csv
.
Begini jadinya…
# impor data dari berkas csv
files <- fs::dir_ls("~/Downloads/datagempa/", regexp = "[0-9]{4}\\.csv")
gempa <- purrr::map_dfr(files, read.csv)
Pelajaran 1 regular expression (regex)
[0-9]
itu untuk mengambil angka 0, 1, 2, …, 8, 9{4}
berarti ada 4 digit yang diambil\\.csv
supaya terambil pattern.csv
, sedangkan\\
adalah escape character untuk karakter titik (.
)
Saya memerlukan regex ini karena di dalam direktori “datagempa” ada berkas csv
lain yang bukan termasuk data yang ingin saya gabungkan. Dan pola namanya gampang, yaitu berupa tahun.
Setelah itu rapikan sedikit, karena ada beberapa baris yang tidak perlu.
# mengambil nilai yang berulang di tiap baris yang ingin dihilangkan
exclude <- gempa[1,3]
# eliminasi
gempa <- gempa[gempa$WAKTU != exclude,]
# seleksi kolom yang perlu saja
gempa <- gempa[,2:14]
# menamai ulang kolom yang ada
names(gempa) <- c("tanggal", "waktu", "lat", "lon",
"kdlm.KM", "mag.SR", "typemag",
"smaj", "smin", "az", "rms",
"cphase", "region")
Ini tidak usah banyak dijelaskan, gak ada regex-nya.
Lanjut…
Setelah ini agak susah regex-nya (pada awalnya). Saya cari ini sampai sejam lebih hahaha. Tapi setelah ketemu satu, semua tinggal ikuti.
Coba lihat dulu datanya:
head(gempa, 10)
## tanggal waktu lat lon kdlm.KM mag.SR typemag smaj
## 2 1/1/2009 01:26:04 UTC 3.73 LU 127.34 BT 67 Km 4.6 SR MLv 10317
## 3 1/1/2009 03:45:00 UTC 6.84 LS 130.22 BT 103 Km 5.2 SR mb 22841
## 4 1/1/2009 05:27:08 UTC 1.45 LU 120.74 BT 10 Km 5.1 SR MLv 10432
## 5 1/1/2009 08:42:09 UTC 1.52 LU 122.01 BT 10 Km 4.5 SR MLv 7557
## 6 1/1/2009 08:57:01 UTC 8.44 LS 116.17 BT 91 Km 3.4 SR MLv 2699
## 7 1/1/2009 10:35:35 UTC 1.41 LU 122 BT 34 Km 5 SR Mw(mB 84783
## 8 1/1/2009 12:36:57 UTC 9.37 LU 124.14 BT 529 Km 4.7 SR mb 40997
## 9 1/1/2009 13:02:11 UTC 7.17 LS 108.44 BT 10 Km 3.3 SR MLv 1268
## 10 1/1/2009 13:23:41 UTC 0.65 LU 100.99 BT 127 Km 3.2 SR MLv 1642
## 11 1/1/2009 15:49:54 UTC 4.32 LS 119.56 BT 10 Km 3.1 SR MLv 3216
## smin az rms cphase region
## 2 1804.000 147 0.398 25 Talaud Islands, Indonesia
## 3 2778.000 48 2101.000 37 Banda Sea
## 4 1.540 121 1936.000 20 Minahassa Peninsula, Sulawesi
## 5 1043.000 136 0.826 10 Minahassa Peninsula, Sulawesi
## 6 0.193 261 0.413 10 Sumbawa Region, Indonesia
## 7 0.933 46 1633.000 85 Minahassa Peninsula, Sulawesi
## 8 2694.000 145 1004.000 19 Mindanao, Philippines
## 9 0.730 133 1467.000 7 Java, Indonesia
## 10 0.330 255 0.319 5 Northern Sumatra, Indonesia
## 11 0.407 158 0.736 12 Sulawesi, Indonesia
Pelajaran 2 regex!
Regex berikutnya digunakan di kolom koordinat, kedalaman, dan magnitudo. Karena di situ masih campur-campur dengan unitnya (LS, LU, BT, BB, Km, SR).
# kolom tanggal
gempa$tanggal <- as.Date(gempa$tanggal, format = "%m/%d/%Y")
# kolom koordinat
gempa$lat <- gsub("^(\\d+)\\.?(\\d+)? LU$", "\\1\\.\\2", gempa$lat)
gempa$lat <- gsub("^(\\d+)\\.?(\\d+)? LS$", "-\\1\\.\\2", gempa$lat)
gempa$lon <- gsub("^(\\d+)\\.?(\\d+)? BT$", "\\1\\.\\2", gempa$lon)
gempa$lon <- gsub("^(\\d+)\\.?(\\d+)? BB$", "-\\1\\.\\2", gempa$lon)
gempa$lat <- as.double(gempa$lat)
gempa$lon <- as.double(gempa$lon)
# kolom kedalaman
gempa$kdlm.KM <- as.numeric(gsub("^(\\d+)\\.?(\\d+)? Km$", "\\1\\.\\2", gempa$kdlm.KM))
# kolom magnitudo
gempa$mag.SR <- as.numeric(gsub("^(\\d+)\\.?(\\d+)? SR$", "\\1\\.\\2", gempa$mag.SR))
# kolom tipe magnitudo
gempa[gempa$typemag == "Mw(mB",]$typemag <- "Mw(mB)"
gempa$typemag <- as.factor(gempa$typemag)
Polanya begini:
^(\\d+)\\.?(\\d+)? LU$
^ ... $
ini menandakan awal (^
) dan akhir ($
)(...)
tanda kurung adalah untuk grouping\\d
mengambil digit (angka) ditambah+
untuk mengindikasikan kalau digitnya bisa 0 atau lebih, seperti biasa\\
adalah escape character-nya\\.?
mengambil titik (.
), tapi karena boleh jadi ada boleh jadi tidak maka ditambah tanda tanya (?
)
Hm… Capek, guys!
Untuk mempelajari ini, bisa ke web di akhir tulisan.
Terima kasih!
Situs Belajar Regex
- https://regexone.com (saya rekomendasikan)
- https://www.regular-expressions.info