02 September 2014

dplyr package exercise: in Indonesia language

1. Intro

Tutorial singkat ini merupakan translasi dari artikel yang sama oleh Kevin Markham di blognya (lihat Referensi). Narasi saya ubah sedikit agar lebih mudah dimengerti untuk para pemula. Kode R dan komentar dalam bahasa Inggris tidak saya ubah. Terimakasih untuk Hadley Wickham (@hadleywickham) penulis dplyr dan Kevin Markham (@justmarkham).

2. Start

Package dplyr adalah package yang diperlukan untuk melakukan manipulasi data frame. Kelebihan dplyr:

  • Fungsional untuk eksplorasi dan transformasi data.
  • Fungsi yang intuitif dan mudah dimengerti.
  • Cepat

Ada lima fungsi dasar dalam package ini:

  • filter(): untuk memfilter baris (row) dari data frame berdasarkan beberapa kriteria yang anda miliki.
  • select(): untuk memilih satu atau dua kolom (column) yang anda perlukan.
  • arrange(): untuk menyortir (sorting), yaitu untuk mengurutkan baris berdasarkan nilai dari satu atau lebih kolom secara ascending atau descending.
  • mutate(): untuk menambah kolom baru yang merupakan hasil transformasi dari kolom yang lain.
  • summarise(): untuk memperlihatkan informasi dasar dari suatu data frame, misal: rata-rata (mean), standar deviasi (SD), dll. Fungsi ini sering digabung dengan fungsi group().

2.1 Instalasi

Bagi yang belum menginstalasi package ini, silahkan melakukan instalasi dengan perintah berikut ini:

install.packages("dplyr")

Mulailah latihan ini dengan memuat library package dplyr dan data frame hflights. Data hflights adalah contoh data yang diambil dari data penerbangan dari dua bandara di Houston US pada tahun 2011.

# load packages
library(dplyr)
## 
## 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(hflights)

Cobalah mengeskplorasi data dengan perintah berikut ini:

# explore data
data(hflights)
head(hflights)
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
##      FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424       428  N576AA                60      40      -10        0    IAH
## 5425       428  N557AA                60      45       -9        1    IAH
## 5426       428  N541AA                70      48       -8       -8    IAH
## 5427       428  N403AA                70      39        3        3    IAH
## 5428       428  N492AA                62      44       -3        5    IAH
## 5429       428  N262AA                64      45       -7       -1    IAH
##      Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424  DFW      224      7      13         0                         0
## 5425  DFW      224      6       9         0                         0
## 5426  DFW      224      5      17         0                         0
## 5427  DFW      224      9      22         0                         0
## 5428  DFW      224      9       9         0                         0
## 5429  DFW      224      6      13         0                         0

Tampilan sedikit agak kacau bukan. Kita bisa mengakalinya dengan membuat “local data frame” bernama “flights” agar tampilan bisa kita atur. Ketik perintah di bawah ini dan bandingkan tampilannya dengan sebelumnya.

# convert to local data frame
flights <- tbl_df(hflights)

# printing only shows 10 rows and as many columns as can fit on your screen
flights
## Source: local data frame [227,496 x 21]
## 
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
## 5430 2011     1          7         5    1359    1509            AA
## 5431 2011     1          8         6    1355    1454            AA
## 5432 2011     1          9         7    1443    1554            AA
## 5433 2011     1         10         1    1443    1553            AA
## ..    ...   ...        ...       ...     ...     ...           ...
## Variables not shown: FlightNum (int), TailNum (chr), ActualElapsedTime
##   (int), AirTime (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest
##   (chr), Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)

Kalau masih kurang memuaskan, anda bisa mengatur berapa jumlah baris yang mau anda lihat (misalkan 20 baris) dengan perintah berikut.

# you can specify that you want to see more rows
print(flights, n=20)
## Source: local data frame [227,496 x 21]
## 
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
## 5430 2011     1          7         5    1359    1509            AA
## 5431 2011     1          8         6    1355    1454            AA
## 5432 2011     1          9         7    1443    1554            AA
## 5433 2011     1         10         1    1443    1553            AA
## 5434 2011     1         11         2    1429    1539            AA
## 5435 2011     1         12         3    1419    1515            AA
## 5436 2011     1         13         4    1358    1501            AA
## 5437 2011     1         14         5    1357    1504            AA
## 5438 2011     1         15         6    1359    1459            AA
## 5439 2011     1         16         7    1359    1509            AA
## 5440 2011     1         17         1    1530    1634            AA
## 5441 2011     1         18         2    1408    1508            AA
## 5442 2011     1         19         3    1356    1503            AA
## 5443 2011     1         20         4    1507    1622            AA
## ..    ...   ...        ...       ...     ...     ...           ...
## Variables not shown: FlightNum (int), TailNum (chr), ActualElapsedTime
##   (int), AirTime (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest
##   (chr), Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)
# convert to a normal data frame to see all of the columns
data.frame(head(flights))
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
##      FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424       428  N576AA                60      40      -10        0    IAH
## 5425       428  N557AA                60      45       -9        1    IAH
## 5426       428  N541AA                70      48       -8       -8    IAH
## 5427       428  N403AA                70      39        3        3    IAH
## 5428       428  N492AA                62      44       -3        5    IAH
## 5429       428  N262AA                64      45       -7       -1    IAH
##      Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424  DFW      224      7      13         0                         0
## 5425  DFW      224      6       9         0                         0
## 5426  DFW      224      5      17         0                         0
## 5427  DFW      224      9      22         0                         0
## 5428  DFW      224      9       9         0                         0
## 5429  DFW      224      6      13         0                         0

2.2 Chaining / pipelining

Istilah “chaining” atau “pipelining” adalah kata lain untuk perintah bersarang (nested command). Perintah dasar R biasanya menggunakan banyak simbol “( )” untuk kombinasi lebih dari satu perintah dalam satu baris kode. Seringkali kita lupa menghitung pasangan simbol bracket tersebut, sehingga menghasilkan pesan kesalahan (warnings). Di dplyr kita gunakan syntax %>% yang menggantikan kata-kata “kemudian” (“then”). Untuk lebih jelasnya kita lihat contoh berikut.

Kalau anda ingin mengetahui penerbangan mana saja yang memiliki waktu delay keberangkatan (DepDelay) lebih dari 60 menit, maka akan melakukan:

  • pilih data.frame = “flights”
  • pilih kolom yang diperlukan = “UniqueCarrier” dan “DepDelay”
  • filter kolom “DepDelay” = “> 60”

Ikuti kode berikut:

# nesting method to select UniqueCarrier and DepDelay columns and filter for delays over 60 minutes
filter(select(flights, UniqueCarrier, DepDelay), DepDelay > 60)
## Source: local data frame [10,242 x 2]
## 
##    UniqueCarrier DepDelay
## 1             AA       90
## 2             AA       67
## 3             AA       74
## 4             AA      125
## 5             AA       82
## 6             AA       99
## 7             AA       70
## 8             AA       61
## 9             AA       74
## 10            AS       73
## ..           ...      ...
# chaining (dplyr) method
flights %>%
    select(UniqueCarrier, DepDelay) %>%
    filter(DepDelay > 60)
## Source: local data frame [10,242 x 2]
## 
##    UniqueCarrier DepDelay
## 1             AA       90
## 2             AA       67
## 3             AA       74
## 4             AA      125
## 5             AA       82
## 6             AA       99
## 7             AA       70
## 8             AA       61
## 9             AA       74
## 10            AS       73
## ..           ...      ...

3. Fungsi dasar (Basic functions/verbs)

3.1 filter()

Fungsi filter() adalah untuk memilih baris atau mengelompokkan baris berdasarkan kriteria yang anda miliki. Fungsi ini sebenarnya telah tersedia dalam R secara default, namun package dplyr membuatnya lebih mudah. Sekarang kita bandingkan kedua fungsi Filter() tersebut. Perintah berikut ini melakukan filter kolom Month “DAN” (“AND”) kolom DayofMonth yang nilainya sama dengan 1.

# base R approach to view all flights on January 1
flights[flights$Month==1 & flights$DayofMonth==1, ]
## Source: local data frame [552 x 21]
## 
##       Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424  2011     1          1         6    1400    1500            AA
## 6343  2011     1          1         6     728     840            AA
## 19266 2011     1          1         6    1631    1736            AA
## 23655 2011     1          1         6    1756    2112            AA
## 33051 2011     1          1         6    1012    1347            AA
## 35256 2011     1          1         6    1211    1325            AA
## 39453 2011     1          1         6     557     906            AA
## 46433 2011     1          1         6    1824    2106            AS
## 57719 2011     1          1         6     654    1124            B6
## 57720 2011     1          1         6    1639    2110            B6
## ..     ...   ...        ...       ...     ...     ...           ...
## Variables not shown: FlightNum (int), TailNum (chr), ActualElapsedTime
##   (int), AirTime (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest
##   (chr), Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)
# dplyr approach
# note: you can use comma or ampersand to represent AND condition
filter(flights, Month==1, DayofMonth==1)
## Source: local data frame [552 x 21]
## 
##    Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1  2011     1          1         6    1400    1500            AA       428
## 2  2011     1          1         6     728     840            AA       460
## 3  2011     1          1         6    1631    1736            AA      1121
## 4  2011     1          1         6    1756    2112            AA      1294
## 5  2011     1          1         6    1012    1347            AA      1700
## 6  2011     1          1         6    1211    1325            AA      1820
## 7  2011     1          1         6     557     906            AA      1994
## 8  2011     1          1         6    1824    2106            AS       731
## 9  2011     1          1         6     654    1124            B6       620
## 10 2011     1          1         6    1639    2110            B6       622
## ..  ...   ...        ...       ...     ...     ...           ...       ...
## Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
##   (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
##   Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)
filter(flights, Month==1 & DayofMonth==1)
## Source: local data frame [552 x 21]
## 
##    Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1  2011     1          1         6    1400    1500            AA       428
## 2  2011     1          1         6     728     840            AA       460
## 3  2011     1          1         6    1631    1736            AA      1121
## 4  2011     1          1         6    1756    2112            AA      1294
## 5  2011     1          1         6    1012    1347            AA      1700
## 6  2011     1          1         6    1211    1325            AA      1820
## 7  2011     1          1         6     557     906            AA      1994
## 8  2011     1          1         6    1824    2106            AS       731
## 9  2011     1          1         6     654    1124            B6       620
## 10 2011     1          1         6    1639    2110            B6       622
## ..  ...   ...        ...       ...     ...     ...           ...       ...
## Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
##   (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
##   Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)

Anda bisa lihat bahwa dengan dplyr kita cukup mengetik nama kolomnya saja, bukan data.frame$namakolom.

Anda bisa menggunakan operator “ATAU” (“OR”), misalkan anda hanya ingin melihat data penerbangan dari perusahaan (kolom UniqueCarrier) “AA” atau “UA”.

# use pipe for OR condition
filter(flights, UniqueCarrier=="AA" | UniqueCarrier=="UA")
## Source: local data frame [5,316 x 21]
## 
##    Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1  2011     1          1         6    1400    1500            AA       428
## 2  2011     1          2         7    1401    1501            AA       428
## 3  2011     1          3         1    1352    1502            AA       428
## 4  2011     1          4         2    1403    1513            AA       428
## 5  2011     1          5         3    1405    1507            AA       428
## 6  2011     1          6         4    1359    1503            AA       428
## 7  2011     1          7         5    1359    1509            AA       428
## 8  2011     1          8         6    1355    1454            AA       428
## 9  2011     1          9         7    1443    1554            AA       428
## 10 2011     1         10         1    1443    1553            AA       428
## ..  ...   ...        ...       ...     ...     ...           ...       ...
## Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
##   (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
##   Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int)

atau

# you can also use %in% operator
filter(flights, UniqueCarrier %in% c("AA", "UA"))

3.2 select()

Fungsi ini juga adalah fungsi dasar R. Coba kita bandingkan dengan perintah dalam dply. Perintah dibawah ini untuk memilih kolom “DepTime”, “ArrTime”, dan “FlightNum”. Ketiga kolom tersebut tidak menerus.

# base R approach to select DepTime, ArrTime, and FlightNum columns
flights[, c("DepTime", "ArrTime", "FlightNum")]
## Source: local data frame [227,496 x 3]
## 
##      DepTime ArrTime FlightNum
## 5424    1400    1500       428
## 5425    1401    1501       428
## 5426    1352    1502       428
## 5427    1403    1513       428
## 5428    1405    1507       428
## 5429    1359    1503       428
## 5430    1359    1509       428
## 5431    1355    1454       428
## 5432    1443    1554       428
## 5433    1443    1553       428
## ..       ...     ...       ...
# dplyr approach
select(flights, DepTime, ArrTime, FlightNum)
## Source: local data frame [227,496 x 3]
## 
##      DepTime ArrTime FlightNum
## 5424    1400    1500       428
## 5425    1401    1501       428
## 5426    1352    1502       428
## 5427    1403    1513       428
## 5428    1405    1507       428
## 5429    1359    1503       428
## 5430    1359    1509       428
## 5431    1355    1454       428
## 5432    1443    1554       428
## 5433    1443    1553       428
## ..       ...     ...       ...

Sekarang bagaimana bila kolom yang akan anda pilih, menerus. Gunakan “:”. Dalam perintah berikut ini, kita ingin melihat kolom “Year” hingga “DayofMonth” dan kolom-kolom lain yang mengandung kata-kata “Taxi” dan “Delay”.

# use colon to select multiple contiguous columns, and use `contains` to match columns by name
# note: `starts_with`, `ends_with`, and `matches` (for regular expressions) can also be used to match columns by name
select(flights, Year:DayofMonth, contains("Taxi"), contains("Delay"))
## Source: local data frame [227,496 x 7]
## 
##      Year Month DayofMonth TaxiIn TaxiOut ArrDelay DepDelay
## 5424 2011     1          1      7      13      -10        0
## 5425 2011     1          2      6       9       -9        1
## 5426 2011     1          3      5      17       -8       -8
## 5427 2011     1          4      9      22        3        3
## 5428 2011     1          5      9       9       -3        5
## 5429 2011     1          6      6      13       -7       -1
## 5430 2011     1          7     12      15       -1       -1
## 5431 2011     1          8      7      12      -16       -5
## 5432 2011     1          9      8      22       44       43
## 5433 2011     1         10      6      19       43       43
## ..    ...   ...        ...    ...     ...      ...      ...

3.3 arrange()

Fungsi membantu anda untuk memilih beberapa kolom dan mengurutkan (sorting) set kolom tersebut berdasarkan kolom tertentu. Kali ini kita akan memilih kolom “UniquesCarrier” dan “DepDelay” dan menyortirnya berdasarkan kolom “DepDelay” secara ascending atau dari nilai kecil ke besar.

Urutan code dengan fungsi R default adalah: + pilih data.frame = “flights” + pilih kolom kriteria = “flights$DepDelay” + pilih kolom set yang akan anda urutkan (sortir) secara ascending = “UniqueCarrier” dan “DepDelay”

# base R approach to select UniqueCarrier and DepDelay columns and sort by DepDelay
flights[order(flights$DepDelay), c("UniqueCarrier", "DepDelay")]
## Source: local data frame [227,496 x 2]
## 
##         UniqueCarrier DepDelay
## 5996719            OO      -33
## 927973             MQ      -23
## 1694833            XE      -19
## 3814017            XE      -19
## 83407              CO      -18
## 5035285            EV      -18
## 457114             XE      -17
## 1043606            CO      -17
## 1442181            XE      -17
## 1965737            MQ      -17
## ..                ...      ...

Dengan urutan yang sama kita pakai teknik dplyr.

# dplyr approach
flights %>%
    select(UniqueCarrier, DepDelay) %>%
    arrange(DepDelay)
## Source: local data frame [227,496 x 2]
## 
##    UniqueCarrier DepDelay
## 1             OO      -33
## 2             MQ      -23
## 3             XE      -19
## 4             XE      -19
## 5             CO      -18
## 6             EV      -18
## 7             XE      -17
## 8             CO      -17
## 9             XE      -17
## 10            MQ      -17
## ..           ...      ...

Kalau anda ingin menyortir secara descending, gunakan operator “desc”.

# dplyr approach
flights %>%
    select(UniqueCarrier, DepDelay) %>%
    arrange(desc(DepDelay))
## Source: local data frame [227,496 x 2]
## 
##    UniqueCarrier DepDelay
## 1             CO      981
## 2             AA      970
## 3             MQ      931
## 4             UA      869
## 5             MQ      814
## 6             MQ      803
## 7             CO      780
## 8             CO      758
## 9             DL      730
## 10            MQ      691
## ..           ...      ...

3.4 mutate()

Dengan fungsi ini anda bisa membuat kolom baru (new column or new variable) berdasarkan suatu fungsi. Bila anda menggunakan fungsi default R, maka urutan kodenya adalah:

  • buat data.frame baru = “flights$Speed”
  • buat fungsi persamaannya = “flights\(Distance / flights\)AirTime*60"
  • lihat hasilnya
# base R approach to create a new variable Speed (in mph)
flights$Speed <- flights$Distance / flights$AirTime*60
flights[, c("Distance", "AirTime", "Speed")]
## Source: local data frame [227,496 x 3]
## 
##      Distance AirTime Speed
## 5424      224      40 336.0
## 5425      224      45 298.7
## 5426      224      48 280.0
## 5427      224      39 344.6
## 5428      224      44 305.5
## 5429      224      45 298.7
## 5430      224      43 312.6
## 5431      224      40 336.0
## 5432      224      41 327.8
## 5433      224      45 298.7
## ..        ...     ...   ...

Bila anda menggunakan dplyr:

  • pilih data.frame = “flights”
  • pilih kolom variabel yang diperlukan = “Distance dan AirTime”
  • buat fungsi persamaannya = “Speed = Distance / AirTime*60“. Hasilnya belum disimpan sebagai variabel baru.
  • simpan sebagai variabel yang baru
# dplyr approach (prints the new variable but does not store it)
flights %>%
    select(Distance, AirTime) %>%
    mutate(Speed = Distance/AirTime*60)
## Source: local data frame [227,496 x 3]
## 
##    Distance AirTime Speed
## 1       224      40 336.0
## 2       224      45 298.7
## 3       224      48 280.0
## 4       224      39 344.6
## 5       224      44 305.5
## 6       224      45 298.7
## 7       224      43 312.6
## 8       224      40 336.0
## 9       224      41 327.8
## 10      224      45 298.7
## ..      ...     ...   ...

atau anda bisa mempersingkatnya menjadi:

# store the new variable
flights <- flights %>% mutate(Speed = Distance/AirTime*60)

3.5 summarise()

Fungsi ini untuk melihat ringkasan (summary) dari suatu kolom (variabel) atau grup kolom (group of variables).

Sebagai contoh, jika anda ingin menghitung rata-rata delay kedatangan (arrival delay) untuk tiap tujuan (destination), maka alurnya sbb jika menggunakan fungsi default R:

  • pilih data.frame = “flights”
  • tapply kolom yang diperlukan = “ArrDelay” dan “Dest”
  • fungsi yang diperlukan = “mean” dan abaikan baris NA = “na.rm=TRUE”
  • Atau anda bisa menggunakan fungsi “aggregate”.
# base R approaches to calculate the average arrival delay to each destination
head(with(flights, tapply(ArrDelay, Dest, mean, na.rm=TRUE)))
##    ABQ    AEX    AGS    AMA    ANC    ASE 
##  7.226  5.839  4.000  6.840 26.081  6.795
# or you can use "aggregate"
head(aggregate(ArrDelay ~ Dest, flights, mean))
##   Dest ArrDelay
## 1  ABQ    7.226
## 2  AEX    5.839
## 3  AGS    4.000
## 4  AMA    6.840
## 5  ANC   26.081
## 6  ASE    6.795

Alur dengan dplyr: + pilih data.frame = “flights” + group_by kolom = “Dest” + summarise dengan menghitung “mean” dari kolom “ArrDelay”, abaikan baris NA = “na.rm=TRUE” + simpan hasil dalam kolom “avg_delay”

# dplyr approach: create a table grouped by Dest, and then summarise each group by taking the mean of ArrDelay
flights %>%
    group_by(Dest) %>%
    summarise(avg_delay = mean(ArrDelay, na.rm=TRUE))
## Source: local data frame [116 x 2]
## 
##    Dest avg_delay
## 1   ABQ     7.226
## 2   AEX     5.839
## 3   AGS     4.000
## 4   AMA     6.840
## 5   ANC    26.081
## 6   ASE     6.795
## 7   ATL     8.233
## 8   AUS     7.449
## 9   AVL     9.974
## 10  BFL   -13.199
## ..  ...       ...

Dengan fungsi summarise_each() anda bisa menggunakan fungsi summary yang sama untuk beberapa kolom sekaligus. Hal yang sama untuk fungsi mutate_each().

Alurnya sebagai berikut:

  • pilih data.frame = “flights”
  • group_by = “UniqueCarrier”
  • lakukan summarise_each untuk menghitung “mean” terhadap persentase penerbangan yang “Cancelled” dan “Diverted”
# for each carrier, calculate the percentage of flights cancelled or diverted
flights %>%
    group_by(UniqueCarrier) %>%
    summarise_each(funs(mean), Cancelled, Diverted)
## Source: local data frame [15 x 3]
## 
##    UniqueCarrier Cancelled Diverted
## 1             AA  0.018496 0.001850
## 2             AS  0.000000 0.002740
## 3             B6  0.025899 0.005755
## 4             CO  0.006783 0.002627
## 5             DL  0.015903 0.003029
## 6             EV  0.034483 0.003176
## 7             F9  0.007160 0.000000
## 8             FL  0.009818 0.003273
## 9             MQ  0.029045 0.001936
## 10            OO  0.013947 0.003487
## 11            UA  0.016409 0.002413
## 12            US  0.011269 0.001470
## 13            WN  0.015504 0.002294
## 14            XE  0.015496 0.003450
## 15            YV  0.012658 0.000000

Contoh lain anda ingin mengetahui nilai min dan max untuk kolom-kolom dengan kata-kata “Delay” untuk tiap perusahaan penerbangan dalam kolom “UniqueCarrier”. Alurnya sbb:

  • pilih data.frame = “flights”
  • group_by = “UniqueCarrier”
  • lakukan summarise_each() untuk melihat “min” dan “max” pada kolom yang mengandung kata “Delay”
# for each carrier, calculate the minimum and maximum arrival and departure delays
flights %>%
    group_by(UniqueCarrier) %>%
    summarise_each(funs(min(., na.rm=TRUE), max(., na.rm=TRUE)), matches("Delay"))
## Source: local data frame [15 x 5]
## 
##    UniqueCarrier ArrDelay_min DepDelay_min ArrDelay_max DepDelay_max
## 1             AA          -39          -15          978          970
## 2             AS          -43          -15          183          172
## 3             B6          -44          -14          335          310
## 4             CO          -55          -18          957          981
## 5             DL          -32          -17          701          730
## 6             EV          -40          -18          469          479
## 7             F9          -24          -15          277          275
## 8             FL          -30          -14          500          507
## 9             MQ          -38          -23          918          931
## 10            OO          -57          -33          380          360
## 11            UA          -47          -11          861          869
## 12            US          -42          -17          433          425
## 13            WN          -44          -10          499          548
## 14            XE          -70          -19          634          628
## 15            YV          -32          -11           72           54

3.6 Fungsi agregasi/window

Berikut ini adalah contoh fungsi-fungsi:

  • agregasi (aggregation function) = mean
  • pemeringkatan (ranking function) = min_rank
  • offset function = lead dan lag
  • agregasi kumulatif = cummean

Berikut ini contohnya:

Kasus pertama: Untuk tiap penerbangan (carrier), hitung dua hari dalam setahun yang mana terjadi delay keberangkatan terpanjang (kolom “DepDelay”).

Anda akan melakukan:

  • pilih data.frame = “flights”
  • pilih kolom yang diperlukan = “Month”, “DayofMonth”, dan “DepDelay”
  • pilih kolom untuk membuat peringkat = “DepDelay”
  • sortir kolom penerbangan (“UniqueCarrier”) berdasarkan “DepDelay” secara descending (desc)
# for each carrier, calculate which two days of the year they had their longest departure delays
# note: smallest (not largest) value is ranked as 1, so you have to use `desc` to rank by largest value
flights %>%
    group_by(UniqueCarrier) %>%
    select(Month, DayofMonth, DepDelay) %>%
    filter(min_rank(desc(DepDelay)) <= 2) %>%
    arrange(UniqueCarrier, desc(DepDelay))
## Source: local data frame [30 x 4]
## Groups: UniqueCarrier
## 
##    UniqueCarrier Month DayofMonth DepDelay
## 1             AA    12         12      970
## 2             AA    11         19      677
## 3             AS     2         28      172
## 4             AS     7          6      138
## 5             B6    10         29      310
## 6             B6     8         19      283
## 7             CO     8          1      981
## 8             CO     1         20      780
## 9             DL    10         25      730
## 10            DL     4          5      497
## 11            EV     6         25      479
## 12            EV     1          5      465
## 13            F9     5         12      275
## 14            F9     5         20      240
## 15            FL     2         19      507
## 16            FL     3         14      493
## 17            MQ    11          8      931
## 18            MQ     6          9      814
## 19            OO     2         27      360
## 20            OO     4          4      343
## 21            UA     6         21      869
## 22            UA     9         18      588
## 23            US     4         19      425
## 24            US     8         26      277
## 25            WN     4          8      548
## 26            WN     9         29      503
## 27            XE    12         29      628
## 28            XE    12         29      511
## 29            YV     4         22       54
## 30            YV     4         30       46

Agar lebih sederhana, anda bisa menggunakan fungsi top_n sebagai berikut.

# rewrite more simply with the `top_n` function
flights %>%
    group_by(UniqueCarrier) %>%
    select(Month, DayofMonth, DepDelay) %>%
    top_n(2) %>%
    arrange(UniqueCarrier, desc(DepDelay))
## Selecting by DepDelay
## Source: local data frame [30 x 4]
## Groups: UniqueCarrier
## 
##    UniqueCarrier Month DayofMonth DepDelay
## 1             AA    12         12      970
## 2             AA    11         19      677
## 3             AS     2         28      172
## 4             AS     7          6      138
## 5             B6    10         29      310
## 6             B6     8         19      283
## 7             CO     8          1      981
## 8             CO     1         20      780
## 9             DL    10         25      730
## 10            DL     4          5      497
## 11            EV     6         25      479
## 12            EV     1          5      465
## 13            F9     5         12      275
## 14            F9     5         20      240
## 15            FL     2         19      507
## 16            FL     3         14      493
## 17            MQ    11          8      931
## 18            MQ     6          9      814
## 19            OO     2         27      360
## 20            OO     4          4      343
## 21            UA     6         21      869
## 22            UA     9         18      588
## 23            US     4         19      425
## 24            US     8         26      277
## 25            WN     4          8      548
## 26            WN     9         29      503
## 27            XE    12         29      628
## 28            XE    12         29      511
## 29            YV     4         22       54
## 30            YV     4         30       46

Kasus kedua:

Untuk tiap bulan, hitung jumlah penerbangan dan perubahannya dari bulan sebelumnya.

Anda akan melakukan:

  • pilih data.frame = “flights”
  • kelompokkan berdasarkan bulan = “group_by(Month)”
  • “summarise” = “flight_count”
  • buat fungsi menghitung perbedaan “lag” = “change = flight_count - lag(flight_count)”

Berikut kodenya:

# for each month, calculate the number of flights and the change from the previous month
flights %>%
    group_by(Month) %>%
    summarise(flight_count = n()) %>%
    mutate(change = flight_count - lag(flight_count))
## Source: local data frame [12 x 3]
## 
##    Month flight_count change
## 1      1        18910     NA
## 2      2        17128  -1782
## 3      3        19470   2342
## 4      4        18593   -877
## 5      5        19172    579
## 6      6        19600    428
## 7      7        20548    948
## 8      8        20176   -372
## 9      9        18065  -2111
## 10    10        18696    631
## 11    11        18021   -675
## 12    12        19117   1096

Atau anda bisa memakai fungsi tally agar lebih sederhana.

# rewrite more simply with the `tally` function
flights %>%
    group_by(Month) %>%
    tally() %>%
    mutate(change = n - lag(n))
## Source: local data frame [12 x 3]
## 
##    Month     n change
## 1      1 18910     NA
## 2      2 17128  -1782
## 3      3 19470   2342
## 4      4 18593   -877
## 5      5 19172    579
## 6      6 19600    428
## 7      7 20548    948
## 8      8 20176   -372
## 9      9 18065  -2111
## 10    10 18696    631
## 11    11 18021   -675
## 12    12 19117   1096

3.7 Beberapa fungsi bermanfaat

  • Mengambil “n” baris secara acak dari data.frame, n = 5, menggunakan fungsi sample_n()
# randomly sample a fixed number of rows, without replacement
flights %>% sample_n(5)
## Source: local data frame [5 x 22]
## 
##        Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 106653 2011     6         24         5    1020    1214            XE
## 166549 2011     9          3         6    1640    1823            XE
## 54775  2011     3          6         7    1955    2100            XE
## 142214 2011     8          7         7    1629    1928            XE
## 194946 2011    11          8         2    2129      17            CO
## Variables not shown: FlightNum (int), TailNum (chr), ActualElapsedTime
##   (int), AirTime (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest
##   (chr), Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int), Speed (dbl)
  • Mengambil “n” persen baris secara acak dari data.frame, n = 0.25, menggunakan fungsi sample_frac()
# randomly sample a fraction of rows, with replacement
flights %>% sample_frac(0.25, replace=TRUE)
## Source: local data frame [56,874 x 22]
## 
##        Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 3858   2011     1         13         4    1207    1619            CO
## 84746  2011     5          7         6    1127    1233            XE
## 22628  2011     2         11         5    1341    1800            CO
## 207686 2011    11         26         6     849    1221            US
## 12562  2011     1         30         7    2123    2337            XE
## 199659 2011    11          3         4    1636    1923            XE
## 220639 2011    12         15         4    1549    1721            XE
## 196089 2011    11          2         3    1441    1604            CO
## 208029 2011    11          3         4    2045    2211            WN
## 69459  2011     4         26         2    1529    1623            XE
## ..      ...   ...        ...       ...     ...     ...           ...
## Variables not shown: FlightNum (int), TailNum (chr), ActualElapsedTime
##   (int), AirTime (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest
##   (chr), Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
##   CancellationCode (chr), Diverted (int), Speed (dbl)
  • Melihat struktur data.frame. Anda bisa menggunakan str() sebagai fungsi dasar R. Bandingkan dengan glimpse() dalam dplyr.
# base R approach to view the structure of an object
str(flights)
## Classes 'tbl_df', 'tbl' and 'data.frame':    227496 obs. of  22 variables:
##  $ Year             : int  2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 ...
##  $ Month            : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ DayofMonth       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ DayOfWeek        : int  6 7 1 2 3 4 5 6 7 1 ...
##  $ DepTime          : int  1400 1401 1352 1403 1405 1359 1359 1355 1443 1443 ...
##  $ ArrTime          : int  1500 1501 1502 1513 1507 1503 1509 1454 1554 1553 ...
##  $ UniqueCarrier    : chr  "AA" "AA" "AA" "AA" ...
##  $ FlightNum        : int  428 428 428 428 428 428 428 428 428 428 ...
##  $ TailNum          : chr  "N576AA" "N557AA" "N541AA" "N403AA" ...
##  $ ActualElapsedTime: int  60 60 70 70 62 64 70 59 71 70 ...
##  $ AirTime          : int  40 45 48 39 44 45 43 40 41 45 ...
##  $ ArrDelay         : int  -10 -9 -8 3 -3 -7 -1 -16 44 43 ...
##  $ DepDelay         : int  0 1 -8 3 5 -1 -1 -5 43 43 ...
##  $ Origin           : chr  "IAH" "IAH" "IAH" "IAH" ...
##  $ Dest             : chr  "DFW" "DFW" "DFW" "DFW" ...
##  $ Distance         : int  224 224 224 224 224 224 224 224 224 224 ...
##  $ TaxiIn           : int  7 6 5 9 9 6 12 7 8 6 ...
##  $ TaxiOut          : int  13 9 17 22 9 13 15 12 22 19 ...
##  $ Cancelled        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CancellationCode : chr  "" "" "" "" ...
##  $ Diverted         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Speed            : num  336 299 280 345 305 ...
# dplyr approach: better formatting, and adapts to your screen width
glimpse(flights)
## Variables:
## $ Year              (int) 2011, 2011, 2011, 2011, 2011, 2011, 2011, 20...
## $ Month             (int) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ DayofMonth        (int) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ DayOfWeek         (int) 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,...
## $ DepTime           (int) 1400, 1401, 1352, 1403, 1405, 1359, 1359, 13...
## $ ArrTime           (int) 1500, 1501, 1502, 1513, 1507, 1503, 1509, 14...
## $ UniqueCarrier     (chr) "AA", "AA", "AA", "AA", "AA", "AA", "AA", "A...
## $ FlightNum         (int) 428, 428, 428, 428, 428, 428, 428, 428, 428,...
## $ TailNum           (chr) "N576AA", "N557AA", "N541AA", "N403AA", "N49...
## $ ActualElapsedTime (int) 60, 60, 70, 70, 62, 64, 70, 59, 71, 70, 70, ...
## $ AirTime           (int) 40, 45, 48, 39, 44, 45, 43, 40, 41, 45, 42, ...
## $ ArrDelay          (int) -10, -9, -8, 3, -3, -7, -1, -16, 44, 43, 29,...
## $ DepDelay          (int) 0, 1, -8, 3, 5, -1, -1, -5, 43, 43, 29, 19, ...
## $ Origin            (chr) "IAH", "IAH", "IAH", "IAH", "IAH", "IAH", "I...
## $ Dest              (chr) "DFW", "DFW", "DFW", "DFW", "DFW", "DFW", "D...
## $ Distance          (int) 224, 224, 224, 224, 224, 224, 224, 224, 224,...
## $ TaxiIn            (int) 7, 6, 5, 9, 9, 6, 12, 7, 8, 6, 8, 4, 6, 5, 6...
## $ TaxiOut           (int) 13, 9, 17, 22, 9, 13, 15, 12, 22, 19, 20, 11...
## $ Cancelled         (int) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ CancellationCode  (chr) "", "", "", "", "", "", "", "", "", "", "", ...
## $ Diverted          (int) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Speed             (dbl) 336.0, 298.7, 280.0, 344.6, 305.5, 298.7, 31...

Anda juga bisa membaca dan memanipulasi database SQL dengan R melalui dplyr. Anda bisa secara langsung mengunjungi website dataschool oleh Kevin Markham (lihat Referensi).

5. Penutup

Saya akan kembangkan posting ini dengan beberapa aplikasi lainnya, khususnya untuk manipulasi data hydrology.

Selamat mencoba.

@dasaptaerwin

Referensi

No comments: