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’.
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 :
Pengaruhnya terhadap baris (row) :
filter(), digunakan untuk mencari subset data yg sesuai dengan logika yg diinginkan.
arrange(), digunakan untuk mengubah urutan baris data
slice(), digunakan untuk mencari subset data, berdasarkan posisi barisnya (bukan logika, seperti filter)
Pengaruhnya terhadap kolom (coloumn) :
select(), memilih beberapa variabel yg ditampilkan
rename(), mengubah nama kolom
mutate(), membuat kolom/variabel baru berdasar perhitungan tertentu dari variabel yg ada tanpa menghapus variabel aslinya
transmute(), membuat variabel baru dengan menghapus variabel aslinya
relocate(), mengubah urutan kolom
Selain fungsi-fungsi di ats, terdapat dua fungsi atau grammar lain yang sering digunakan, yaitu :
group_by(), fungsi ini akan menunjukkan kegunaannya saat digunakan sebelum fungsi manipulasi lain.
summarise(), collapse nilai menjadi sebuah sederet nilai ringkas.
Note : fungsi manipulasi di atas tidak mengubah inputnya (kecuali transmute), sehingga jika kita ingin menyimpan hasil manipulasi data, perlu dibuatkan sebuah objek untuk menyimpannya.
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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
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() :
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
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
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
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
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.
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>
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
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.
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() 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(x)
## [1] 1 2 6 24 120 720 5040 40320 362880
## [10] 3628800
y <- rev(x)
cummin(x)
## [1] 1 1 1 1 1 1 1 1 1 1
cummax(x)
## [1] 1 2 3 4 5 6 7 8 9 10
cummean(x)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
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.
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.