Setelah mempelajari tentang visualisasi data,kita tahu konsep cara mudah untuk mendapatkan insight sebuah data. Tapi seringkali data tidak data dengan bentuk yang cantik dan siap untuk diolah. Seringkali yang kita dapatkan adalah barisan angka dan kata yg berantakan dan tidak memungkinkan untuk dipahami secara langsung. Untuk itu, diperlukan tahap transformasi data. Cara mudah untuk melakukan transformasi adalah dengan menggunakan beberapa tools, utamanya adalah dplyr dan tidyr. dplyr adalah tool yg membantu kita untuk memfilter dan membuat variabel baru yang memungkinkan untuk melihat data lebih jernih. Sementara tidyr adalah tool yg membantu kita untuk mentransformasi bentuk data yg tidak ‘tidy’ menjadi lebih rapi. Umumnya, kita bisa melakukan load pada masing-masing tool secara tersendiri, namun karena pada praktiknya kita akan menggunakan keduanya secara beriringan, R membantu pekerjaan dengan menyatukan keduanya (beserta beberapa tool lainnya) dalam satu paket bernama ‘tidyverse’.

Prequisites

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.4     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.0.2     v forcats 0.5.1
## Warning: package 'tidyr' was built under R version 4.1.2
## Warning: package 'dplyr' was built under R version 4.1.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Untuk datanya, pada pembahasan kali ini, kita akan menggunakan data penerbangan keberangkatan dari New York pada tahun 2013.

load("C:\\Users\\Galih Dwika Putra R\\Documents\\R\\Practice\\flights.rda")
library(magrittr)
## 
## Attaching package: 'magrittr'
## The following object is masked from 'package:purrr':
## 
##     set_names
## The following object is masked from 'package:tidyr':
## 
##     extract

Setelah melakukan load data, kita coba baca

flights
## # A tibble: 336,776 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Di dplyr, terdapat beberapa grammar yg digunakan untuk manipulasi data, dibagi terhadap pengharuhny secara baris dan kolom, berikut adalah grammar-grammar tersebut :

Note : fungsi manipulasi di atas tidak mengubah inputnya (kecuali transmute), sehingga jika kita ingin menyimpan hasil manipulasi data, perlu dibuatkan sebuah objek untuk menyimpannya.

Penggunaan filter()

Contoh filter()

filter(flights, month == 1, day == 1)
## # A tibble: 842 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 832 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Jika diperhatikan, fungsi filter menggunakan ekspresi komparasi seperti ‘==’ untuk melakukan subset data. Ekspresi komparasi lain yg bisa digunakan adalah ‘!=’, ‘>’, ‘>=’,‘<’, dan ‘<=’.

Selain komparasi, juga ada logika yg bisa digunakan, seperti : * “&” untuk logika “dan” * “|” untuk logika “atau” * “xor” untuk logika “selain U1 DAN U2”, “hanya U1 dan hanya U2”

contoh Logika

flights %>% filter(month == 11 | month == 12)
## # A tibble: 55,403 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013    11     1        5           2359         6      352            345
##  2  2013    11     1       35           2250       105      123           2356
##  3  2013    11     1      455            500        -5      641            651
##  4  2013    11     1      539            545        -6      856            827
##  5  2013    11     1      542            545        -3      831            855
##  6  2013    11     1      549            600       -11      912            923
##  7  2013    11     1      550            600       -10      705            659
##  8  2013    11     1      554            600        -6      659            701
##  9  2013    11     1      554            600        -6      826            827
## 10  2013    11     1      554            600        -6      749            751
## # ... with 55,393 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Alternatif penulisan lain untuk hasil di atas bisa menggunakan %in%.

flights %>% filter(month %in% c(11,12))
## # A tibble: 55,403 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013    11     1        5           2359         6      352            345
##  2  2013    11     1       35           2250       105      123           2356
##  3  2013    11     1      455            500        -5      641            651
##  4  2013    11     1      539            545        -6      856            827
##  5  2013    11     1      542            545        -3      831            855
##  6  2013    11     1      549            600       -11      912            923
##  7  2013    11     1      550            600       -10      705            659
##  8  2013    11     1      554            600        -6      659            701
##  9  2013    11     1      554            600        -6      826            827
## 10  2013    11     1      554            600        -6      749            751
## # ... with 55,393 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Exercise 1.11

  1. Temukan semua penerbangan yang memenuhi kriteria berikut :
  • Kedatangannya (arrival) terlambat dua jam atau lebih Jawab :
flights %>% filter(arr_delay >= 240)
## # A tibble: 1,571 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      848           1835       853     1001           1950
##  2  2013     1     1     1815           1325       290     2120           1542
##  3  2013     1     1     1842           1422       260     1958           1535
##  4  2013     1     1     2115           1700       255     2330           1920
##  5  2013     1     1     2205           1720       285       46           2040
##  6  2013     1     1     2343           1724       379      314           1938
##  7  2013     1     2     1332            904       268     1616           1128
##  8  2013     1     2     1412            838       334     1710           1147
##  9  2013     1     2     1607           1030       337     2003           1355
## 10  2013     1     2     2131           1512       379     2340           1741
## # ... with 1,561 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Penerbangan ke Houston (IAH atau HOU) Jawab :
flights %>% filter(dest == "IAH" | dest == "HOU")
## # A tibble: 9,313 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      623            627        -4      933            932
##  4  2013     1     1      728            732        -4     1041           1038
##  5  2013     1     1      739            739         0     1104           1038
##  6  2013     1     1      908            908         0     1228           1219
##  7  2013     1     1     1028           1026         2     1350           1339
##  8  2013     1     1     1044           1045        -1     1352           1351
##  9  2013     1     1     1114            900       134     1447           1222
## 10  2013     1     1     1205           1200         5     1503           1505
## # ... with 9,303 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Dioperasikan oleh United, American, atau Delta

jawab :

flights %>% filter(carrier == "UA" | carrier == "DL" | carrier == "AA")
## # A tibble: 139,504 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      554            600        -6      812            837
##  5  2013     1     1      554            558        -4      740            728
##  6  2013     1     1      558            600        -2      753            745
##  7  2013     1     1      558            600        -2      924            917
##  8  2013     1     1      558            600        -2      923            937
##  9  2013     1     1      559            600        -1      941            910
## 10  2013     1     1      559            600        -1      854            902
## # ... with 139,494 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Keberangkatan saat musim panas (Bulan Juli, Agustus, September)

jawab :

flights %>% filter(month == 7 | month == 8 | month == 9)
## # A tibble: 86,326 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     7     1        1           2029       212      236           2359
##  2  2013     7     1        2           2359         3      344            344
##  3  2013     7     1       29           2245       104      151              1
##  4  2013     7     1       43           2130       193      322             14
##  5  2013     7     1       44           2150       174      300            100
##  6  2013     7     1       46           2051       235      304           2358
##  7  2013     7     1       48           2001       287      308           2305
##  8  2013     7     1       58           2155       183      335             43
##  9  2013     7     1      100           2146       194      327             30
## 10  2013     7     1      100           2245       135      337            135
## # ... with 86,316 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Kedatangan terlambat lebih dari dua jam tapi keberangkatan tepat waktu

jawab :

flights %>% filter(arr_delay >= 120 & dep_delay <=0 )
## # A tibble: 29 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1    27     1419           1420        -1     1754           1550
##  2  2013    10     7     1350           1350         0     1736           1526
##  3  2013    10     7     1357           1359        -2     1858           1654
##  4  2013    10    16      657            700        -3     1258           1056
##  5  2013    11     1      658            700        -2     1329           1015
##  6  2013     3    18     1844           1847        -3       39           2219
##  7  2013     4    17     1635           1640        -5     2049           1845
##  8  2013     4    18      558            600        -2     1149            850
##  9  2013     4    18      655            700        -5     1213            950
## 10  2013     5    22     1827           1830        -3     2217           2010
## # ... with 19 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
## #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Terlambat berangkat 2 jam tapi tapi bisa datang 30 menit lebih cepat

jawab :

flights %>% filter(dep_delay >= 60 & arr_delay <= 30 )
## # A tibble: 239 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     3     1850           1745        65     2148           2120
##  2  2013     1     3     1950           1845        65     2228           2227
##  3  2013     1     3     2015           1915        60     2135           2111
##  4  2013     1     6     1019            900        79     1558           1530
##  5  2013     1     7     1543           1430        73     1758           1735
##  6  2013     1    11     1020            920        60     1311           1245
##  7  2013     1    12     1706           1600        66     1949           1927
##  8  2013     1    12     1953           1845        68     2154           2137
##  9  2013     1    19     1456           1355        61     1636           1615
## 10  2013     1    21     1531           1430        61     1843           1815
## # ... with 229 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Keberangkatan dari tengah malam sampai jam 6 pagi

Jawab :

flights %>% filter(is.na(dep_time) | dep_time <= 600 )
## # A tibble: 17,599 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 17,589 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Contoh penggunaan between()

jawab :

flights %>% filter(is.na(dep_time)|between(dep_time,0,600))
## # A tibble: 17,599 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1      517            515         2      830            819
##  2  2013     1     1      533            529         4      850            830
##  3  2013     1     1      542            540         2      923            850
##  4  2013     1     1      544            545        -1     1004           1022
##  5  2013     1     1      554            600        -6      812            837
##  6  2013     1     1      554            558        -4      740            728
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
## # ... with 17,589 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Berapa banyak pesawat dengan dep_time NA?

Jawab :

flights %>% filter(is.na(dep_time))
## # A tibble: 8,255 x 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     1     1       NA           1630        NA       NA           1815
##  2  2013     1     1       NA           1935        NA       NA           2240
##  3  2013     1     1       NA           1500        NA       NA           1825
##  4  2013     1     1       NA            600        NA       NA            901
##  5  2013     1     2       NA           1540        NA       NA           1747
##  6  2013     1     2       NA           1620        NA       NA           1746
##  7  2013     1     2       NA           1355        NA       NA           1459
##  8  2013     1     2       NA           1420        NA       NA           1644
##  9  2013     1     2       NA           1321        NA       NA           1536
## 10  2013     1     2       NA           1545        NA       NA           1910
## # ... with 8,245 more rows, and 11 more variables: arr_delay <dbl>,
## #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  1. Variabel apa lagi yang punya nilai hilang?

jawab :

summary(is.na(flights))
##     year           month            day           dep_time      
##  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
##  FALSE:336776    FALSE:336776    FALSE:336776    FALSE:328521   
##                                                  TRUE :8255     
##  sched_dep_time  dep_delay        arr_time       sched_arr_time 
##  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
##  FALSE:336776    FALSE:328521    FALSE:328063    FALSE:336776   
##                  TRUE :8255      TRUE :8713                     
##  arr_delay        carrier          flight         tailnum       
##  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
##  FALSE:327346    FALSE:336776    FALSE:336776    FALSE:334264   
##  TRUE :9430                                      TRUE :2512     
##    origin           dest          air_time        distance      
##  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
##  FALSE:336776    FALSE:336776    FALSE:327346    FALSE:336776   
##                                  TRUE :9430                     
##     hour           minute        time_hour      
##  Mode :logical   Mode :logical   Mode :logical  
##  FALSE:336776    FALSE:336776    FALSE:336776   
## 

Variabel yg punya nilai kosong : + dep_time, dep_delay, arr_time, arr_delay, tailnum, air_time

Penggunaan select()

Fungsi select() adalah untuk memilih variabel (kolom) tertentu untuk ditampilkan

contoh :

flights %>% select(month, day, carrier, dep_delay, arr_delay)
## # A tibble: 336,776 x 5
##    month   day carrier dep_delay arr_delay
##    <int> <int> <chr>       <dbl>     <dbl>
##  1     1     1 UA              2        11
##  2     1     1 UA              4        20
##  3     1     1 AA              2        33
##  4     1     1 B6             -1       -18
##  5     1     1 DL             -6       -25
##  6     1     1 UA             -4        12
##  7     1     1 B6             -5        19
##  8     1     1 EV             -3       -14
##  9     1     1 B6             -3        -8
## 10     1     1 AA             -2         8
## # ... with 336,766 more rows

ada sedikit trik untuk mengelaborasi penggunaan select() :

  • Memilih variabel dalam rentang tertentu
flights %>% select(arr_time:arr_delay)
## # A tibble: 336,776 x 3
##    arr_time sched_arr_time arr_delay
##       <int>          <int>     <dbl>
##  1      830            819        11
##  2      850            830        20
##  3      923            850        33
##  4     1004           1022       -18
##  5      812            837       -25
##  6      740            728        12
##  7      913            854        19
##  8      709            723       -14
##  9      838            846        -8
## 10      753            745         8
## # ... with 336,766 more rows
  • Memilih semua variabel selain variabel tertentu
flights%>% select(-(month:carrier))
## # A tibble: 336,776 x 10
##     year flight tailnum origin dest  air_time distance  hour minute
##    <int>  <int> <chr>   <chr>  <chr>    <dbl>    <dbl> <dbl>  <dbl>
##  1  2013   1545 N14228  EWR    IAH        227     1400     5     15
##  2  2013   1714 N24211  LGA    IAH        227     1416     5     29
##  3  2013   1141 N619AA  JFK    MIA        160     1089     5     40
##  4  2013    725 N804JB  JFK    BQN        183     1576     5     45
##  5  2013    461 N668DN  LGA    ATL        116      762     6      0
##  6  2013   1696 N39463  EWR    ORD        150      719     5     58
##  7  2013    507 N516JB  EWR    FLL        158     1065     6      0
##  8  2013   5708 N829AS  LGA    IAD         53      229     6      0
##  9  2013     79 N593JB  JFK    MCO        140      944     6      0
## 10  2013    301 N3ALAA  LGA    ORD        138      733     6      0
## # ... with 336,766 more rows, and 1 more variable: time_hour <dttm>
  • Memilih semua variabel dengan pola atau konten tertentu

    • starts_with(“xxx”)
      • Contoh :
flights %>% select(starts_with("arr"))
## # A tibble: 336,776 x 2
##    arr_time arr_delay
##       <int>     <dbl>
##  1      830        11
##  2      850        20
##  3      923        33
##  4     1004       -18
##  5      812       -25
##  6      740        12
##  7      913        19
##  8      709       -14
##  9      838        -8
## 10      753         8
## # ... with 336,766 more rows
  • ends_with(“xxx”)
    • Contoh :
flights %>% select(ends_with("time"))
## # A tibble: 336,776 x 5
##    dep_time sched_dep_time arr_time sched_arr_time air_time
##       <int>          <int>    <int>          <int>    <dbl>
##  1      517            515      830            819      227
##  2      533            529      850            830      227
##  3      542            540      923            850      160
##  4      544            545     1004           1022      183
##  5      554            600      812            837      116
##  6      554            558      740            728      150
##  7      555            600      913            854      158
##  8      557            600      709            723       53
##  9      557            600      838            846      140
## 10      558            600      753            745      138
## # ... with 336,766 more rows
  • contains(“xxx”)
    • Contoh :
flights %>% select(contains("rie"))
## # A tibble: 336,776 x 1
##    carrier
##    <chr>  
##  1 UA     
##  2 UA     
##  3 AA     
##  4 B6     
##  5 DL     
##  6 UA     
##  7 B6     
##  8 EV     
##  9 B6     
## 10 AA     
## # ... with 336,766 more rows
  • matches(“reg.expression”) Untuk yg ini, contoh akan dijelaskan setelah aku paham soal regular expression

  • num_range(“var”,numeric:numeric) –> contoh akan dijelaskan nanti.

  • everything(), digunakan untuk memilih seluruh variabel yg ada setelah variabel tertentu dipilih.

    • Contoh :
flights %>% select(arr_delay, flight, everything())
## # A tibble: 336,776 x 19
##    arr_delay flight  year month   day dep_time sched_dep_time dep_delay arr_time
##        <dbl>  <int> <int> <int> <int>    <int>          <int>     <dbl>    <int>
##  1        11   1545  2013     1     1      517            515         2      830
##  2        20   1714  2013     1     1      533            529         4      850
##  3        33   1141  2013     1     1      542            540         2      923
##  4       -18    725  2013     1     1      544            545        -1     1004
##  5       -25    461  2013     1     1      554            600        -6      812
##  6        12   1696  2013     1     1      554            558        -4      740
##  7        19    507  2013     1     1      555            600        -5      913
##  8       -14   5708  2013     1     1      557            600        -3      709
##  9        -8     79  2013     1     1      557            600        -3      838
## 10         8    301  2013     1     1      558            600        -2      753
## # ... with 336,766 more rows, and 10 more variables: sched_arr_time <int>,
## #   carrier <chr>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Exercise Select()

  1. panggil dep_time, dep_delay, arr_delay, dan arr_time dengan berbagai cara

Jawab :

flights %>% select(starts_with("dep") | starts_with("arr"))
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
flights %>% select(starts_with(c("dep","arr")))
## # A tibble: 336,776 x 4
##    dep_time dep_delay arr_time arr_delay
##       <int>     <dbl>    <int>     <dbl>
##  1      517         2      830        11
##  2      533         4      850        20
##  3      542         2      923        33
##  4      544        -1     1004       -18
##  5      554        -6      812       -25
##  6      554        -4      740        12
##  7      555        -5      913        19
##  8      557        -3      709       -14
##  9      557        -3      838        -8
## 10      558        -2      753         8
## # ... with 336,766 more rows
  1. Apa yg terjadi saat kita memanggil variabel yg sama lebih dari sekali?

Jawab :

flights %>% select(dep_delay, arr_time, dep_delay)
## # A tibble: 336,776 x 2
##    dep_delay arr_time
##        <dbl>    <int>
##  1         2      830
##  2         4      850
##  3         2      923
##  4        -1     1004
##  5        -6      812
##  6        -4      740
##  7        -5      913
##  8        -3      709
##  9        -3      838
## 10        -2      753
## # ... with 336,766 more rows

Meski variabel yg sama terpanggil dua kali atau lebih, R hanya akan menampilkan variabel itu sekali dalam urutan pertama kali dia dipanggil.

  1. Apa fungsi dari any_of()?
vars <- c("year", "month", "day", "dep_delay", "arr_delay")
flights %>% select(any_of(vars))
## # A tibble: 336,776 x 5
##     year month   day dep_delay arr_delay
##    <int> <int> <int>     <dbl>     <dbl>
##  1  2013     1     1         2        11
##  2  2013     1     1         4        20
##  3  2013     1     1         2        33
##  4  2013     1     1        -1       -18
##  5  2013     1     1        -6       -25
##  6  2013     1     1        -4        12
##  7  2013     1     1        -5        19
##  8  2013     1     1        -3       -14
##  9  2013     1     1        -3        -8
## 10  2013     1     1        -2         8
## # ... with 336,766 more rows

contoh lain :

flights %>% select(contains("TIME"))
## # A tibble: 336,776 x 6
##    dep_time sched_dep_time arr_time sched_arr_time air_time time_hour          
##       <int>          <int>    <int>          <int>    <dbl> <dttm>             
##  1      517            515      830            819      227 2013-01-01 05:00:00
##  2      533            529      850            830      227 2013-01-01 05:00:00
##  3      542            540      923            850      160 2013-01-01 05:00:00
##  4      544            545     1004           1022      183 2013-01-01 05:00:00
##  5      554            600      812            837      116 2013-01-01 06:00:00
##  6      554            558      740            728      150 2013-01-01 05:00:00
##  7      555            600      913            854      158 2013-01-01 06:00:00
##  8      557            600      709            723       53 2013-01-01 06:00:00
##  9      557            600      838            846      140 2013-01-01 06:00:00
## 10      558            600      753            745      138 2013-01-01 06:00:00
## # ... with 336,766 more rows

Mutate()

Mutate() adalah fungsi untuk membuat sebuah kolom baru berdasar pengolahand data pada kolom sebelumnya.

Untuk pembahasan bagian ini, kita akan membuat dataset baru

newFlights <- flights %>% select(year:day, ends_with("delay"),
                                 distance, air_time)

newFlights
## # A tibble: 336,776 x 7
##     year month   day dep_delay arr_delay distance air_time
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl>
##  1  2013     1     1         2        11     1400      227
##  2  2013     1     1         4        20     1416      227
##  3  2013     1     1         2        33     1089      160
##  4  2013     1     1        -1       -18     1576      183
##  5  2013     1     1        -6       -25      762      116
##  6  2013     1     1        -4        12      719      150
##  7  2013     1     1        -5        19     1065      158
##  8  2013     1     1        -3       -14      229       53
##  9  2013     1     1        -3        -8      944      140
## 10  2013     1     1        -2         8      733      138
## # ... with 336,766 more rows

Sekarang kita buah variabel baru bernama ‘gain’ yg mengukur berapa lama pesawat yg terlambat berangkat (dep_delay) bisa membayar kesalasahan dengan datang lebih cepat (arr_delay). Secara matematis,Jika dep_delay > arr_delay, maka gain yg dilakukan penerbangan terkait lebih besar. Variabel kedua yang kita buat adalah ‘speed’ diukur dengan membagi jarak tempuh penerbangan (dist) dengan waktu tempuh penerbangan (air_time). Karena satuan waktu di atas dalam menit,maka untuk mengoversi speed ke dalam jam, hasil pembagian perlu dikalikan 60.

contoh mutate():

newFlights %>% mutate(
  gain = dep_delay - arr_delay,
  speed = distance / air_time * 60
)
## # A tibble: 336,776 x 9
##     year month   day dep_delay arr_delay distance air_time  gain speed
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
##  1  2013     1     1         2        11     1400      227    -9  370.
##  2  2013     1     1         4        20     1416      227   -16  374.
##  3  2013     1     1         2        33     1089      160   -31  408.
##  4  2013     1     1        -1       -18     1576      183    17  517.
##  5  2013     1     1        -6       -25      762      116    19  394.
##  6  2013     1     1        -4        12      719      150   -16  288.
##  7  2013     1     1        -5        19     1065      158   -24  404.
##  8  2013     1     1        -3       -14      229       53    11  259.
##  9  2013     1     1        -3        -8      944      140     5  405.
## 10  2013     1     1        -2         8      733      138   -10  319.
## # ... with 336,766 more rows
newFlights
## # A tibble: 336,776 x 7
##     year month   day dep_delay arr_delay distance air_time
##    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl>
##  1  2013     1     1         2        11     1400      227
##  2  2013     1     1         4        20     1416      227
##  3  2013     1     1         2        33     1089      160
##  4  2013     1     1        -1       -18     1576      183
##  5  2013     1     1        -6       -25      762      116
##  6  2013     1     1        -4        12      719      150
##  7  2013     1     1        -5        19     1065      158
##  8  2013     1     1        -3       -14      229       53
##  9  2013     1     1        -3        -8      944      140
## 10  2013     1     1        -2         8      733      138
## # ... with 336,766 more rows

Penggunaan mutate() dapat memanfaatkan operator dan fungsi matematis berikut : * Operasi matematik : “+”,“-”,"“,”/“,”^" Modular : %/% (integer division) dan %% (remainder) * Logs : log(), log2(), log10() + note : rekomendasi penggunaan log2() karena kemudahan intrepretasi, di mana selisih 1 dalam skala log berarti double nilai pada nilai asli sementara selisih -1 dalam skala log berarti setengah pada nilai asli. * Kumulatif dan aggregasi : + cumsum : akumulasi penjumlahan contoh :

x <- c(1:10)
cumsum(x)
##  [1]  1  3  6 10 15 21 28 36 45 55
  • cumprod : Akumulasi pengalian contoh :
cumprod(x)
##  [1]       1       2       6      24     120     720    5040   40320  362880
## [10] 3628800
  • cummin() : Rolling nilai minimal di tiap point contoh:
y <- rev(x)
cummin(x)
##  [1] 1 1 1 1 1 1 1 1 1 1
  • cummax() : Rolling max Contoh :
cummax(x)
##  [1]  1  2  3  4  5  6  7  8  9 10
  • cummean() : Rolling rerata tiap akumulasi poin contoh :
cummean(x)
##  [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5

group_by() dan summarise

Kedua fungsi di atas perlu digunakan bersamaan untuk menunjukkan kegunaan yang sebenarnya. Contoh :

flights %>% group_by(carrier) %>% summarise(delay = mean(dep_delay, na.rm = TRUE))
## # A tibble: 16 x 2
##    carrier delay
##    <chr>   <dbl>
##  1 9E      16.7 
##  2 AA       8.59
##  3 AS       5.80
##  4 B6      13.0 
##  5 DL       9.26
##  6 EV      20.0 
##  7 F9      20.2 
##  8 FL      18.7 
##  9 HA       4.90
## 10 MQ      10.6 
## 11 OO      12.6 
## 12 UA      12.1 
## 13 US       3.78
## 14 VX      12.9 
## 15 WN      17.7 
## 16 YV      19.0

Contoh 2 : Untuk bermain-main, kita kembangkan fungsi ini dengan ggplot

delay <- flights %>% group_by(dest) %>%
  summarise(
    count = n(),
    dist = mean(distance, na.rm = TRUE),
    delay = mean(arr_delay, na.rm = TRUE)
  ) %>%
  filter(count > 20, dest != "NHL") %>%
  ggplot(aes(x = dist, y = delay)) + geom_point(aes(size = count), alpha = 1/3) +
  geom_smooth(se = FALSE)

Sekarang, tampilkan hasilnya :

delay
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Note : Bisa kita lihat, selain mutate()/transmute(), summarise juga memampukan user untuk membuat variabel baru berdasarkan transformasi data asli. Tapi seperti yg bisa kita lihat juga, fungsi ini perlu didahului oleh group_by.

Beberapa fungsi summarise

Selain mean(), terdapat fungsi lain yang juga berguna, diantaranya : * median() * sd(), standart deviation * IQR(), Interquartile Range * mad(), robust median * min(), pengukuran rank dari yg paling minimal * quantile(x, 0.25), generalisasi median * max(), menunjukkan rank dari yg paling besar * n(), menghitung jumlah group yg bersangkutan * sum(!is.na(x)), menghitung banyaknya yg non missing * n_distinct(var), menghitung jumlah nilai distinct

flights %>% count(dest)
## # A tibble: 105 x 2
##    dest      n
##    <chr> <int>
##  1 ABQ     254
##  2 ACK     265
##  3 ALB     439
##  4 ANC       8
##  5 ATL   17215
##  6 AUS    2439
##  7 AVL     275
##  8 BDL     443
##  9 BGR     375
## 10 BHM     297
## # ... with 95 more rows

Count dan persentase dari nilai logika.

Ini berguna untuk menghitung dan/atau mengetahui proporsi subset data yang memenuhi nilai logika tertentu. Misal : berapa banyak pesawat yg terbang lebih awal dari jam 5 pagi ? Jika kita ingin mengetahui detail datanya, kita bisa saja menggunakan :

flights %>% select(dep_time < 500)

Ini akan menunjukkan seluruhnya. Namun jika kita ingin menghitung berapa? Kita gunakan fungsi seperti ini :

flights %>% group_by(year,month, day) %>% 
  summarise(n_early = sum(dep_time<500, na.rm=TRUE))
## # A tibble: 365 x 4
## # Groups:   year, month [12]
##     year month   day n_early
##    <int> <int> <int>   <int>
##  1  2013     1     1       0
##  2  2013     1     2       3
##  3  2013     1     3       4
##  4  2013     1     4       3
##  5  2013     1     5       3
##  6  2013     1     6       2
##  7  2013     1     7       2
##  8  2013     1     8       1
##  9  2013     1     9       3
## 10  2013     1    10       3
## # ... with 355 more rows

di sini kita menggunakan sum() pada summarise dengan ekspresi logika (dep_time < 500) untuk menghitung berapa banyak point data penerbangan dep_time yg kurang dari 500. Contoh lainnya :

flights %>% group_by(year,month, day) %>%
  summarise(hour_prop = mean(arr_delay > 60, na.rm = TRUE))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 4
## # Groups:   year, month [12]
##     year month   day hour_prop
##    <int> <int> <int>     <dbl>
##  1  2013     1     1    0.0722
##  2  2013     1     2    0.0851
##  3  2013     1     3    0.0567
##  4  2013     1     4    0.0396
##  5  2013     1     5    0.0349
##  6  2013     1     6    0.0470
##  7  2013     1     7    0.0333
##  8  2013     1     8    0.0213
##  9  2013     1     9    0.0202
## 10  2013     1    10    0.0183
## # ... with 355 more rows

Pada code di atas, kita menghitung berapa proporsi penerbangan (berdasarkan tanggal dan bulan) yang kedatangannya delay di atas 1 jam.