Di indonesia data hujan seringkali didapatkan dalam bentuk tipikal kolom bulan dan baris tanggal, dengan sheet per data tahun. Data dengan format seperti ini sejauh yang penulis pahami cukup sulit untuk diolah secara otomatis dan membutuhkan reformatting sehingga format nya mudah untuk dilakukan analisis (misal: long format).
Contoh format panjang dapat diunduh disini:
https://drive.google.com/file/d/1xlSCWVJY3yy1HofliLGTV08IdeufkdVb/view?usp=sharing
Contoh data hujan dengan format excel tipikal seperti ini dapat diunduh di sini:
https://drive.google.com/drive/folders/1oUxKmxHcb_WtHu7RBDjpvtqvBXe_3ALo?usp=sharing

Dalam artikel ini saya akan berikan code R (R studio) untuk mengolah data tersebut menjadi format panjang hanya dengan dua kolom (kolom pertama: Tanggal, kolom kedua: besaran hujan (mm/hari)).
1. Install dan muat library
install.packages(c("tidyverse","readxl","snht")
Muat package tersebut
library(tidyverse) library(readxl) library(snht)
2. Membuat fungsi
Pertama-tama saya membuat function untuk kemudian bisa dipanggil kembali. Dalam R Studio, kita dapat membuat fungsi dengan menggunakan perintah function()
. Penggunaan function ini sangat bermanfaat dengan tujuan:
- Modularitas (membagi kode menjadi bagian-bagian yang lebih kecil dan terorganisir)
- Reusabilitas (Fungsi yang sudah dibuat dapat digunakan kembali)
- Penyederhanaan (menyembunyikan detail implementasi yang kompleks dan hanya memerlukan input dan output yang relevan)
Kali ini saya membuat dua fungsi untuk
# Fungsi untuk Menghitung jumlah hari dalam tahun tertentu numberOfDays <- function(date) { m <- format(date, format="%m") while (format(date, format="%m") == m) {date <- date + 1} return(as.integer(format(date - 1, format="%d"))) } # Fungsi utama untuk memformat tabel data hujan tipikal kedalam bentuk tabel yang lebih sederhana standardPrec <- function(f){ years <- excel_sheets(path = f) firstyear <- paste('19',years[1],sep='') lastyear <- as.character(as.integer(firstyear)+length(years)-1) allDates <- seq(as.Date(paste(firstyear,"/01/01",sep='')),as.Date(paste(lastyear,"/12/31",sep='')), by = "day") dfout <- data.frame(Date=NULL,Value=NULL) for (i in years){ iyear <- strftime(as.Date(i,"%y"), "%Y") df <- read_excel(f, sheet = i,col_names = FALSE, .name_repair = ~ vctrs::vec_as_names(..., repair = "unique", quiet = TRUE)) #idx0 <- which(df == "TANGGAL", arr.ind = TRUE); x0<- idx0[2]+1; y0<- idx0[1]+1 idx0 <- which(df == "JAN", arr.ind = TRUE); x0<- idx0[2]; y0<- idx0[1]+1 x1 <- which(df == "DES", arr.ind = TRUE)[2] y1 <- which(df == "31", arr.ind = TRUE)[1] subdf <- df[y0:y1,x0:x1] colnames(subdf) <- 1:12 if (all(is.na(subdf))==T) { #print(paste('Skip for year',i,sep='')) }else{ lst <- append(lst,i) dating <- as.Date(paste()) for (j in 1:12){ imonth <- as.character(j) numdays <- numberOfDays(as.Date(paste(iyear,'-',imonth,'-1',sep=''))) for (k in 1:numdays){ dates <- as.Date(paste(iyear,imonth,k,sep='-')) val <- as.numeric(subdf[k,imonth]) dfin <- data.frame(Date=dates,Value=val) dfout <- rbind(dfout,dfin) } } #print(i) } #cat('Processing', c, 'of', length(allDates),'\n') } return(dfout) }
Edit function diatas sesuai dengan pola tabel data hujan di excel anda. Masing-masing institusi format dapat berbeda. Misal tanggal 1 bulan januari terletak di cell “B18” sedang dalam format lain tidak. Pahami dan sesuaikan coding diatas.
3. Menjalankan program
Setelah running fungsi tersebut anda dapat running main code berikut
# set direktori default pada direktori diatas # semua file yang akan anda proses ada di dalam folder ini setwd('F:/Research-master/') # set direktori keluaran dirout <- 'F:/Research-master/olah/' # set daftar file yang akan dilakukan pemrosesan (khususnya untuk jumlah file lebih dari satu) # disini akan dipilih semua file yang berekstensi '*.xlsx' lst <- list.files(pattern=glob2rx('*.xlsx')) # iterasi untuk masing masing file m<-1 for (n in m:length(lst)){ f <- lst[n] print(f) ext <- tail(strsplit(f,split='.',fixed=T)[[1]],1) namae <- gsub(ext, 'csv', f) df <- standardPrec(f) p <- paste(dirout,namae,sep='') write.csv(df,p) }
Selamat mencoba!