4 min read

Regex: Belajar Merapikan Data

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.

Daftar berkas

Daftar berkas

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