data.table(數據表,Data Table)
數據表(Data Table)係繼承自數據框(Data Frame),前者為後者的增強版本。
首先安裝使用data.table
及hflights
二套組包,前者主為相關函式,後者則為稍大的數據集(原始數據來自美國運輸部運輸統計局:http://www.transtats.bts.gov/DatabaseInfo.asp?DB_ID=120),後文將會用其作為演示用數據集。
install.packages(c("data.table", "dplyr", "hflights"))
library("data.table"); library("dplyr"); library("hflights")
我們先用 2 個較小的數據集,看看如何製作數據表。只要用data.table()
將數據來源作為引數即可,下例將 cars, mtcars 二個數據集分別轉為數據表類別,並利用tables()
總覽數據表物件,可得知該等物件之名稱、橫排數目(觀測例)、直欄數目(變項)、記憶體用量、變項名稱、鍵值(此處尚無設定值)、合計記憶體用量。此處應注意勿將總覽數據表物件的tables()
與頻次計數的table()
二者相混淆。
> cars <- data.table(cars)
> mtcars <- data.table(mtcars)
>
> tables()
NAME NROW NCOL MB COLS KEY
[1,] cars 50 2 1 speed,dist
[2,] mtcars 32 11 1 mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
Total: 2MB
以下再將 hflights 轉為數據表 hf,再用tables()
總覽,可知其具有 227,496 個觀測例(橫排)、21 個變項(直欄),因為數據較多,故該物件記憶體用量較大,也因變項數目較多,故直欄名稱列舉不盡。
> hf <- data.table(hflights)
> tables()
NAME NROW NCOL MB
[1,] cars 50 2 1
[2,] hf 227,496 21 23
[3,] mtcars 32 11 1
COLS KEY
[1,] speed,dist
[2,] Year,Month,DayofMonth,DayOfWeek,DepTime,ArrTime,UniqueCarrier,FlightNum,
[3,] mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
Total: 25MB
由於數據表係繼承自數據框,故數據表物件同時具有 data.table 與 data.fram 此二種類別(Class)。
另外,如要知道某數據表中各變項的數據型別,則可利用sapply()
將class()
適用到每一直欄。
> hf <- data.table(hflights)
> class(hf)
[1] "data.table" "data.frame"
>
> sapply(hf, class)
Year Month DayofMonth
"integer" "integer" "integer"
DayOfWeek DepTime ArrTime
"integer" "integer" "integer"
UniqueCarrier FlightNum TailNum
"character" "integer" "character"
ActualElapsedTime AirTime ArrDelay
"integer" "integer" "integer"
DepDelay Origin Dest
"integer" "character" "character"
Distance TaxiIn TaxiOut
"integer" "integer" "integer"
Cancelled CancellationCode Diverted
"integer" "character" "integer"
DataTable[i, j, by]
數據表物件的操作,通式為「DataTable[i, j, by]
」,其中的「i, j, by」三者分別約當於 SQL 中的「WHERE、SELECT、GROUP BY」,基本上在第一部分是以 i 來選取符合指定條件的橫排,在第二部分 j 這裡包括了對選定直欄的計算處理,而在第三部分 by 這裡設定分組方式。
鍵入數據表物件名稱,則顯示出每一直欄的首末各五橫排內容,如下:
> hf
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
---
227492: 2011 12 6 2 1818 2111 WN 1191
227493: 2011 12 6 2 2047 2334 WN 1674
227494: 2011 12 6 2 912 1031 WN 127
227495: 2011 12 6 2 656 812 WN 621
227496: 2011 12 6 2 1600 1713 WN 1597
TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
1: N576AA 60 40 -10 0 IAH DFW 224
2: N557AA 60 45 -9 1 IAH DFW 224
3: N541AA 70 48 -8 -8 IAH DFW 224
4: N403AA 70 39 3 3 IAH DFW 224
5: N492AA 62 44 -3 5 IAH DFW 224
---
227492: N284WN 113 97 -9 8 HOU TPA 781
227493: N366SW 107 94 4 7 HOU TPA 781
227494: N777QC 79 61 -4 -3 HOU TUL 453
227495: N727SW 76 64 -13 -4 HOU TUL 453
227496: N745SW 73 59 -12 0 HOU TUL 453
TaxiIn TaxiOut Cancelled CancellationCode Diverted
1: 7 13 0 0
2: 6 9 0 0
3: 5 17 0 0
4: 9 22 0 0
5: 9 9 0 0
---
227492: 5 11 0 0
227493: 4 9 0 0
227494: 4 14 0 0
227495: 3 9 0 0
227496: 3 11 0 0
以第一部分 i 選取橫排
選取第 2 至第 4 橫排,共 3 橫排,如下:
> hf[2:4]
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1: 2011 1 2 7 1401 1501 AA 428
2: 2011 1 3 1 1352 1502 AA 428
3: 2011 1 4 2 1403 1513 AA 428
TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
1: N557AA 60 45 -9 1 IAH DFW 224
2: N541AA 70 48 -8 -8 IAH DFW 224
3: N403AA 70 39 3 3 IAH DFW 224
TaxiIn TaxiOut Cancelled CancellationCode Diverted
1: 6 9 0 0
2: 5 17 0 0
3: 9 22 0 0
選取最末 2 個橫排,如下:
> hf[(.N-1):(.N)]
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1: 2011 12 6 2 656 812 WN 621
2: 2011 12 6 2 1600 1713 WN 1597
TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
1: N727SW 76 64 -13 -4 HOU TUL 453
2: N745SW 73 59 -12 0 HOU TUL 453
TaxiIn TaxiOut Cancelled CancellationCode Diverted
1: 3 9 0 0
2: 3 11 0 0
選取出發延遲超過 30 分鐘「或」到達地點為洛杉磯的橫排,並顯示該結果尾端 4 個橫排的數據,如下:
> hf[DepDelay > 30 | Dest == "LAX"]
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1: 2011 1 9 7 1443 1554 AA 428
2: 2011 1 10 1 1443 1553 AA 428
3: 2011 1 17 1 1530 1634 AA 428
4: 2011 1 20 4 1507 1622 AA 428
5: 2011 1 31 1 1441 1553 AA 428
---
28026: 2011 12 6 2 1352 1749 WN 3085
28027: 2011 12 6 2 1850 2046 WN 39
28028: 2011 12 6 2 1723 1845 WN 33
28029: 2011 12 6 2 2023 2109 WN 207
28030: 2011 12 6 2 1939 2119 WN 124
TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
1: N476AA 71 41 44 43 IAH DFW 224
2: N504AA 70 45 43 43 IAH DFW 224
3: N518AA 64 48 84 90 IAH DFW 224
4: N425AA 75 42 72 67 IAH DFW 224
5: N505AA 72 39 43 41 IAH DFW 224
---
28026: N510SW 177 163 59 72 HOU PHL 1336
28027: N754SW 176 157 71 70 HOU PHX 1020
28028: N698SW 202 192 70 78 HOU SAN 1313
28029: N354SW 46 38 29 43 HOU SAT 192
28030: N522SW 100 81 14 39 HOU STL 687
TaxiIn TaxiOut Cancelled CancellationCode Diverted
1: 8 22 0 0
2: 6 19 0 0
3: 8 8 0 0
4: 9 24 0 0
5: 8 25 0 0
---
28026: 5 9 0 0
28027: 4 15 0 0
28028: 3 7 0 0
28029: 4 4 0 0
28030: 4 15 0 0
選取暑假期間(月份數為 7, 8)每個周末(星期幾數字為 6, 7)的各橫排(屬於第一部分 i 的操作),如下:
> hf[Month %in% c(7, 8) & DayOfWeek %in% c(6, 7)]
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1: 2011 7 2 6 1637 1749 AA 322
2: 2011 7 9 6 1647 1747 AA 322
3: 2011 7 16 6 1639 1746 AA 322
4: 2011 7 23 6 1746 1847 AA 322
5: 2011 7 30 6 1711 1814 AA 322
---
10838: 2011 8 14 7 737 1021 DL 686
10839: 2011 8 14 7 655 959 DL 810
10840: 2011 8 14 7 904 1153 DL 1590
10841: 2011 8 14 7 1335 1635 DL 1675
10842: 2011 8 14 7 553 857 DL 1884
TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
1: N435AA 72 42 -16 -3 IAH DFW 224
2: N262AA 60 38 -18 7 IAH DFW 224
3: N491AA 67 40 -19 -1 IAH DFW 224
4: N574AA 61 39 42 66 IAH DFW 224
5: N483AA 63 45 9 31 IAH DFW 224
---
10838: N364NW 164 145 -9 -6 IAH MSP 1034
10839: N996DL 124 93 -14 -5 IAH ATL 689
10840: N358NB 109 91 -15 0 IAH ATL 689
10841: N988DL 120 98 -5 5 IAH ATL 689
10842: N917DL 124 96 -8 -2 IAH ATL 689
TaxiIn TaxiOut Cancelled CancellationCode Diverted
1: 7 23 0 0
2: 11 11 0 0
3: 4 23 0 0
4: 5 17 0 0
5: 8 10 0 0
---
10838: 4 15 0 0
10839: 12 19 0 0
10840: 8 10 0 0
10841: 7 15 0 0
10842: 18 10 0 0
以第二部分 j 運算直欄
下例將原本的 4 個變項,經過計算得到的值另立 2 個新變項,其中在原第一部分的 i 的位置要留空,故在「[
」後要先補一個「,
」,再放第二部分 j 的內容。
> hf[, list(機上地面時間 = ActualElapsedTime - AirTime, 延遲時間合計 = ArrDelay + DepDelay) ]
機上地面時間 延遲時間合計
1: 20 -10
2: 15 -8
3: 22 -16
4: 31 6
5: 18 2
---
227492: 16 -1
227493: 13 11
227494: 18 -7
227495: 12 -17
227496: 14 -12
以第三部分 by 進行分組
下例依據出發地點及星期幾這 2 者來分組,計算「延遲時間」的平均值(不計遺缺值)與標準差(不計遺缺值),結果如下:
> hf[, list(延遲時間平均值 = mean(ArrDelay + DepDelay, na.rm = T),
+ 延遲時間標準差 = sd(ArrDelay + DepDelay, na.rm = T)),
+ by = list(Origin, DayOfWeek)]
Origin DayOfWeek 延遲時間平均值 延遲時間標準差
1: IAH 6 13.54943 55.27469
2: IAH 7 16.47202 57.36850
3: IAH 1 17.34940 57.37300
4: IAH 2 12.17560 53.05950
5: IAH 3 11.59321 53.80403
6: IAH 4 19.74220 67.66197
7: IAH 5 15.83386 53.43804
8: HOU 6 13.40663 49.18370
9: HOU 7 17.57598 56.95574
10: HOU 1 21.27724 61.70028
11: HOU 2 15.88447 55.09490
12: HOU 3 19.52619 60.25216
13: HOU 4 30.38929 76.08380
14: HOU 5 21.61502 64.99706