##all 12 months
all_months <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
##our data
some_months <- c("Mar", "Dec", "Jan", "Apr", "Jul")
#Alphabetical sort
sort(some_months)
## [1] "Apr" "Dec" "Jan" "Jul" "Mar"
mon <- factor(some_months, levels = all_months)
mon
## [1] Mar Dec Jan Apr Jul
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
##Interpretasi:
#factor(), berisi data bulan tertentu dan akan diubah menjadi variabel kategorik berdasar urutan bulan.
#some_months, vektor yang berisi bulan tertentu misal seperti contoh di atas (Maret,Desember,Januari,April, dan Juli).
#levels = all_months, akan mengurutkan level kategori bulan dari Januari sampai Desember(all_months).
#mon, setelah data diubah ke dalam vektor maka outputnya akan disimpan ke dalam variabel mon
#Misalnya some_months berisi bulan yang tidak berurutan seperti "Dec", "Mar", "Jan", "Jul", "Apr", maka setelah dijalankan, hasilnya akan tetap mengikuti urutan dari Januari sampai Desember sesuai dengan urutan di all_months. Jadi ketika kita tampilkan variabel mon maka output nya akan menjadi (Levels: Jan Feb Mar ... Dec). Urutan akan tetap sesuai dengan urutan bulan yang benar walaupun data aslinta tidak berurutan pada some_months.
mon <- factor(some_months, levels = all_months)
sort(mon)
## [1] Jan Mar Apr Jul Dec
## Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#sort(), digunakan untuk mengurutkan data, tetapi karena variabel mon sudah berupa faktor maka akan mengurutkan berdasar urutan level faktor yaitu all_months.
#Jika some_months berisi bulan yang tidak urut, seperti Mar, Dec, Jan, Jul, Apr, maka setelah diubah menjadi faktor (mon), fungsi sort() akan mengurutkan bulan-bulan tersebut mengikuti urutan Januari hingga Desember sesuai dengan yang ada di all_months.
library(forcats)
## Warning: package 'forcats' was built under R version 4.4.3
mon_relevel <- fct_relevel(mon,"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", after = 0)
mon_relevel
## [1] Mar Dec Jan Apr Jul
## Levels: Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun
sort(mon_relevel)
## [1] Jul Dec Jan Mar Apr
## Levels: Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr May Jun
#Sintaks di atas ingin mengubah level faktor mon dan memindahkan bulan ("Jul", "Aug", "Sep", "Oct", "Nov", "Dec") setelah bulan "Jan" 
#fungsi package fct_relevel() adalah fungsi dari paket forcats yang digunakan untuk mengubah urutan level faktor.
#mon_relevel akan menampilkan hasil dari faktor yang sudah diubah urutan level yang baru.
#sort_relevel akan mengurutkan faktor mon_relevel berdasarkan urutan level yang baru.
some_moths <- c("Mar", "Dec", "Jan", "Apr", "Jul")
mon_inorder <- fct_inorder(some_months)
mon_inorder
## [1] Mar Dec Jan Apr Jul
## Levels: Mar Dec Jan Apr Jul
sort(mon_inorder)
## [1] Mar Dec Jan Apr Jul
## Levels: Mar Dec Jan Apr Jul
#mon_inorder akan menampilkan variabel mon_inorder yang merupakan hasil dari fct_inorder(), yaitu faktor dengan urutan level yang disesuaikan dengan urutan kemunculan bulan-bulan di some_months. Jadi, sintaks ini akan menunjukkan level faktor yang baru sesuai urutan asli yang ada di some_months.
##sort(mon_inorder) akan mengurutkan faktor mon_inorder berdasarkan urutan levelnya. 
library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
tabyl(chickwts$feed)
##  chickwts$feed  n   percent
##         casein 12 0.1690141
##      horsebean 10 0.1408451
##        linseed 12 0.1690141
##       meatmeal 11 0.1549296
##        soybean 14 0.1971831
##      sunflower 12 0.1690141
fct_infreq(chickwts$feed) %>% head()
## [1] horsebean horsebean horsebean horsebean horsebean horsebean
## Levels: soybean casein linseed sunflower meatmeal horsebean
#tabyl adalah packages janitor untuk membuat tabel frekuensi yang menunjukkan frekuensi yang menunjukkan jumlah dan presentasi setiap kategori dalam variabel (chickwts, jenis pakan)
#fct_infreq adalah packages forcats yang mengurutkan level faktor berdasar jumlah kemunculan dari yang paling sering sampai yang paling jarang.
#Sintaks ini akan mengubah urutan level faktor feed dalam dataset chickwts sehingga level dengan frekuensi tertinggi muncul pertama. Kemudian, head() menampilkan enam level teratas.
fct_rev(fct_infreq(chickwts$feed)) %>% head()
## [1] horsebean horsebean horsebean horsebean horsebean horsebean
## Levels: horsebean meatmeal sunflower linseed casein soybean
#fct_rev adalah membalik urutan level faktor. Dengan membalik urutan setelah menggunakan fct_infreq(), level faktor akan diurutkan dari yang paling jarang hingga yang paling sering.
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## 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
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.2
library(forcats)
chickwts %>%
mutate(newfeed = fct_reorder(feed, weight)) %>%
  ggplot(., aes(newfeed, weight)) + geom_point()

#mutate() untuk membuat kolom baru atau modifikasi kolom yang ada dalam dataframe
#Sintaks ini untuk membuat scatter plot yang menunjukkan hubungan antara jenis pakan (feed) dan berat ayam (weight).Dengan menggunakan fct_reorder(), level feed diurutkan berdasarkan median weight, sehingga plot akan menampilkan jenis pakan dengan urutan yang mencerminkan median berat ayam.
library(janitor)
chickwts %>%
  mutate(feed_recode = fct_recode(feed,
    "seed" = "linseed",
    "bean" = "horsebean",
    "bean" = "soybean",
    "meal" = "meatmeal",
    "seed" = "sunflower",
    "casein" = "casein"
    )) %>%
  tabyl(feed_recode)
##  feed_recode  n   percent
##       casein 12 0.1690141
##         bean 24 0.3380282
##         seed 24 0.3380282
##         meal 11 0.1549296
#Dalam sintaks ini, fct_recode() digunakan untuk mengganti nama level dalam kolom feed sebagai berikut: "linseed" menjadi "seed", "horsebean" dan "soybean" menjadi "bean", "meatmeal" menjadi "meal", "sunflower" menjadi "seed", "casein" tetap "casein". Outputnya, kolom baru feed_recode ditambahkan ke chickwts, di mana level-level dalam feed telah diganti sesuai dengan ketentuan.
library(dplyr)
library(janitor)
chickwts %>%
  mutate(weight_recode = ifelse(weight <= 200, "low", "high"),
         weight_recode = factor(weight_recode)) %>%
  tabyl(weight_recode)
##  weight_recode  n   percent
##           high 54 0.7605634
##            low 17 0.2394366
#sintaks ifelse(weight <= 200, "low", "high"): Fungsi kondisional yang memberikan nilai "low" jika weight kurang dari atau sama dengan 200, dan "high" jika lebih dari 200.
#factor(weight_recode): Mengubah kolom weight_recode menjadi tipe data faktor, untuk analisis data yang kategorik.
#sintaks ini akan menampilkan Tabel frekuensi yang menunjukkan distribusi kategori "low" dan "high" berdasarkan nilai weight.
library(nycflights13)
## Warning: package 'nycflights13' was built under R version 4.4.2
library(dplyr)
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.4.2
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
flights %>%
  select(year,month,day) %>%
  mutate(departure = make_date(year,month,day))
## # A tibble: 336,776 × 4
##     year month   day departure 
##    <int> <int> <int> <date>    
##  1  2013     1     1 2013-01-01
##  2  2013     1     1 2013-01-01
##  3  2013     1     1 2013-01-01
##  4  2013     1     1 2013-01-01
##  5  2013     1     1 2013-01-01
##  6  2013     1     1 2013-01-01
##  7  2013     1     1 2013-01-01
##  8  2013     1     1 2013-01-01
##  9  2013     1     1 2013-01-01
## 10  2013     1     1 2013-01-01
## # ℹ 336,766 more rows
#select digunakan untuk memilih kolom tertentu dari dataset, dalam konteks ini kolom yang dipilih adalah year,month, dan day dari dataset flights.
#mutate akan digunakan untuk membuat kolom baru dengan menggabungnkan kolom year,month,dan day menjadi objek date yang menjadi satu kolom yang lengkap
#sintaks ini akan menghasilkan dataset baru yang hanya berisi kolom year, month, dan day, dan menambahkan kolom baru departure yang berisi tanggal lengkap (hasil dari make_date()).
library(nycflights13)
library(dplyr)
library(lubridate)
flights %>%
  select(year,month,day,hour,minute) %>%
  mutate(departure = make_datetime(year,month,day,hour,minute))
## # A tibble: 336,776 × 6
##     year month   day  hour minute departure          
##    <int> <int> <int> <dbl>  <dbl> <dttm>             
##  1  2013     1     1     5     15 2013-01-01 05:15:00
##  2  2013     1     1     5     29 2013-01-01 05:29:00
##  3  2013     1     1     5     40 2013-01-01 05:40:00
##  4  2013     1     1     5     45 2013-01-01 05:45:00
##  5  2013     1     1     6      0 2013-01-01 06:00:00
##  6  2013     1     1     5     58 2013-01-01 05:58:00
##  7  2013     1     1     6      0 2013-01-01 06:00:00
##  8  2013     1     1     6      0 2013-01-01 06:00:00
##  9  2013     1     1     6      0 2013-01-01 06:00:00
## 10  2013     1     1     6      0 2013-01-01 06:00:00
## # ℹ 336,766 more rows
#select digunakan untuk memilih kolom tertentu dari dataset, dalam konteks ini kolom yang dipilih adalah year,month,day,hour, dan minute dari dataset flights.
#mutate akan menggabungkan komponen tanggal dan waktu yang menghasilkan kolom yang lengkap yang berisi tanggal,jam,menit serta membuat kolom baru departure yang berisi waktu keberangkatan lengkap sesuai ketentuan sebelumnya.
library(nycflights13)
mydate <- ymd("1988-09-29")
#sintaks ini untuk mengkonversi tanggal dalam format year-month-day.

year(mydate)
## [1] 1988
#sintaks ini untuk mengambil tahun dari mydate.

mday(mydate)
## [1] 29
#sintaks ini untuk mengambil tanggal dari mydate.

wday(mydate)
## [1] 5
#sintaks ini untuk mengambil hari dari mydate.

wday(mydate, label =TRUE)
## [1] Thu
## Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
#sintaks ini akan mengembailkan nama hari dalam minggu bukan nomor hari, contoh output nya "Mon" untuk senin.
h_age <- today() - ymd("1979-10-14")
h_age
## Time difference of 16620 days
#sintaks ini menampilkan selisih waktu antara tanggal saat ini dan 14 oktober 1979 yang hasilnya berupa interval dalam satuan hari dan waktu yang tersisa(jam,menit,detik).

as.duration(h_age)
## [1] "1435968000s (~45.5 years)"
#sintaks ini untuk mengkonversi interval waktu menjadi durasi (jumlah detik,menit,jam).

dseconds(15)
## [1] "15s"
#sintaks ini untuk membuat durasi yang mewakili 15 detik.

dminutes(10)
## [1] "600s (~10 minutes)"
#sintaks ini untuk membuat durasi yang mewakili 10 menit.

dhours(c(12,24))
## [1] "43200s (~12 hours)" "86400s (~1 days)"
#sintaks ini untuk membuat durasi yang terdiri dari 12 jam da 24 jam (1 hari).

ddays(0:5)
## [1] "0s"                "86400s (~1 days)"  "172800s (~2 days)"
## [4] "259200s (~3 days)" "345600s (~4 days)" "432000s (~5 days)"
#sintaks ini untuk membuat durasi yang teridri 0 hingga 5 hari yang berupa vektor.

dweeks(3)
## [1] "1814400s (~3 weeks)"
#sintaks ini untuk membuat durasi yang mewakili 3 minggu.

dyears(1)
## [1] "31557600s (~1 years)"
#sintaks ini untuk membuat durasi yang mewakili 1 tahun.
seconds(15)
## [1] "15S"
#sintaks ini untuk membuat durasi yang mewakili 15 detik.

minutes(10)
## [1] "10M 0S"
#sintaks ini untuk membuat durasi yang mewakili 10 menit.

hours(c(12,24))
## [1] "12H 0M 0S" "24H 0M 0S"
#sintaks ini untuk membuat durasi yang terdiri dari 12 jam da 24 jam (1 hari).

days(7)
## [1] "7d 0H 0M 0S"
#sintaks ini untuk membuat durasi yang mewakili 7 hari.

months(1:6)
## [1] "1m 0d 0H 0M 0S" "2m 0d 0H 0M 0S" "3m 0d 0H 0M 0S" "4m 0d 0H 0M 0S"
## [5] "5m 0d 0H 0M 0S" "6m 0d 0H 0M 0S"
#sintaks ini untuk membuat durasi yang mewakili 6 bulan dalam vektor.

weeks(3)
## [1] "21d 0H 0M 0S"
#sintaks ini untuk membuat durasi yang mewakili 3 minggu.

years(1)
## [1] "1y 0m 0d 0H 0M 0S"
#sintaks ini untuk membuat durasi yang mewakili 1 tahun.
library(nycflights13)
library(lubridate)

10*(months(6)+days(1))
## [1] "60m 10d 0H 0M 0S"
#sintaks ini mengalikan durasi 6 bulan dan 1 hari dengan 10.

days(50)+hours(25)+minutes(2)
## [1] "50d 25H 2M 0S"
#sintaks ini menambahkan 50 hari, 25 jam, dan 2 menit yang menghasilkan durasi total.

ymd("2016-01-01")+dyears(1)
## [1] "2016-12-31 06:00:00 UTC"
#sintaks ini menambahkan 1 tahun ke tanggal sebelum 1 januari 2017.

ymd("2016-01-01")+years(1)
## [1] "2017-01-01"
#sintaks ini menambahkan 1 tahun ke tanggal 1 Januari 2017.

ymd_hms("2016-01-01 06:00:00")
## [1] "2016-01-01 06:00:00 UTC"
#sintaks ini untuk mengonversi string (tahun,bulan,hari,jam,menit,dan detik) menjadi objek waktu.

one_pm <- ymd_hms("2016-03-12 13:00:00", tz = "America/New_York")
next_day <- one_pm + ddays(1)
next_day
## [1] "2016-03-13 14:00:00 EDT"
#sintaks ini mnembahkan 1 hari ke tanggal yang disimpan ke dalam one_pm.

one_pm <- ymd_hms("2016-03-12 13:00:00", tz = "America/New_York")
next_day2 <- one_pm + days(1)
next_day2
## [1] "2016-03-13 13:00:00 EDT"
#sintaks ini mnembahkan 1 hari ke tanggal yang disimpan ke dalam one_pm.
years(1) / days(1)
## [1] 365.25
# years(1) adalah durasi 1 tahun dan days(1) adalah durasi yang 1 hari. Operasi diatas akan membagi durasi satu tahun dengan satu hari.

next_year <- today() + years(1)
(today() %--% next_year) %/% days(1)
## [1] 365
#sintaks ini akan membagi interval waktu dengan durasi satu hari untuk menghasilkan jumlah hari antara today() dan next_year (akan menghitung jumlah hari antara 14 Maret 2025 dan 14 Maret 2026, yang hasilnya adalah 365 hari.