data.table(數據表,Data Table)

數據表(Data Table)係繼承自數據框(Data Frame),前者為後者的增強版本。

首先安裝使用data.tablehflights二套組包,前者主為相關函式,後者則為稍大的數據集(原始數據來自美國運輸部運輸統計局: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

results matching ""

    No results matching ""