Data.table

data.table은 data.frame 과 서로 유사한 기능을 제공해지만 data.frame 보다 빠르고 편리하게 자료를 grouping하고 join 할수있습니다. 예제를 위해 ggplot2 패키지에 있는 diamonds 데이터를 이용하겠습니다.

library(ggplot2)
library(data.table)
data(diamonds)
diaDT <- data.table(diamonds)

# data를 확인합니다.
list(diaDT)
## [[1]]
##        carat       cut color clarity depth table price    x    y    z
##     1:  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
##     2:  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
##     3:  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
##     4:  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
##     5:  0.31      Good     J     SI2  63.3    58   335 4.34 4.35 2.75
##    ---                                                               
## 53936:  0.72     Ideal     D     SI1  60.8    57  2757 5.75 5.76 3.50
## 53937:  0.72      Good     D     SI1  63.1    55  2757 5.69 5.75 3.61
## 53938:  0.70 Very Good     D     SI1  62.8    60  2757 5.66 5.68 3.56
## 53939:  0.86   Premium     H     SI2  61.0    58  2757 6.15 6.12 3.74
## 53940:  0.75     Ideal     D     SI2  62.2    55  2757 5.83 5.87 3.64
tables()  #key 값이 없음을 확인합니다.
##      NAME    NROW MB COLS                                            KEY
## [1,] diaDT 53,940 4  carat,cut,color,clarity,depth,table,price,x,y,z    
## Total: 4MB
sapply(diaDT, class)
## $carat
## [1] "numeric"
## 
## $cut
## [1] "ordered" "factor" 
## 
## $color
## [1] "ordered" "factor" 
## 
## $clarity
## [1] "ordered" "factor" 
## 
## $depth
## [1] "numeric"
## 
## $table
## [1] "numeric"
## 
## $price
## [1] "integer"
## 
## $x
## [1] "numeric"
## 
## $y
## [1] "numeric"
## 
## $z
## [1] "numeric"
setkey(diaDT, cut)
tables()
##      NAME    NROW MB COLS                                            KEY
## [1,] diaDT 53,940 4  carat,cut,color,clarity,depth,table,price,x,y,z cut
## Total: 4MB


# 자료에서 변수들의 값을 가공하거나 필요한 부분만 선택하기 위해선 setkey를
# 지정해줘야합니다. setkey(data,변수) 변수 cut 중 Premium만 지정하여
# 자료를 분리 합니다.
diaDT["Premium", ]  #setkey가 cut으로 지정돼있어야합니다.
##            cut carat color clarity depth table price    x    y    z
##     1: Premium  0.21     E     SI1  59.8    61   326 3.89 3.84 2.31
##     2: Premium  0.29     I     VS2  62.4    58   334 4.20 4.23 2.63
##     3: Premium  0.22     F     SI1  60.4    61   342 3.88 3.84 2.33
##     4: Premium  0.20     E     SI2  60.2    62   345 3.79 3.75 2.27
##     5: Premium  0.32     E      I1  60.9    58   345 4.38 4.42 2.68
##    ---                                                             
## 13787: Premium  0.79     E     SI2  61.4    58  2756 6.03 5.96 3.68
## 13788: Premium  0.71     E     SI1  60.5    55  2756 5.79 5.74 3.49
## 13789: Premium  0.71     F     SI1  59.8    62  2756 5.74 5.73 3.43
## 13790: Premium  0.72     D     SI1  62.7    59  2757 5.69 5.73 3.58
## 13791: Premium  0.86     H     SI2  61.0    58  2757 6.15 6.12 3.74
diaDT.prem <- diaDT["Premium", ]
list(diaDT.prem)
## [[1]]
##            cut carat color clarity depth table price    x    y    z
##     1: Premium  0.21     E     SI1  59.8    61   326 3.89 3.84 2.31
##     2: Premium  0.29     I     VS2  62.4    58   334 4.20 4.23 2.63
##     3: Premium  0.22     F     SI1  60.4    61   342 3.88 3.84 2.33
##     4: Premium  0.20     E     SI2  60.2    62   345 3.79 3.75 2.27
##     5: Premium  0.32     E      I1  60.9    58   345 4.38 4.42 2.68
##    ---                                                             
## 13787: Premium  0.79     E     SI2  61.4    58  2756 6.03 5.96 3.68
## 13788: Premium  0.71     E     SI1  60.5    55  2756 5.79 5.74 3.49
## 13789: Premium  0.71     F     SI1  59.8    62  2756 5.74 5.73 3.43
## 13790: Premium  0.72     D     SI1  62.7    59  2757 5.69 5.73 3.58
## 13791: Premium  0.86     H     SI2  61.0    58  2757 6.15 6.12 3.74
tables()
##      NAME         NROW MB COLS                                           
## [1,] diaDT      53,940 4  carat,cut,color,clarity,depth,table,price,x,y,z
## [2,] diaDT.prem 13,791 1  cut,carat,color,clarity,depth,table,price,x,y,z
##      KEY
## [1,] cut
## [2,] cut
## Total: 5MB

## 2개 이상의 key도 지정할수있습니다. setkeyv 를 이요하여 2개 이상의 key를
## 지정할수있습니다. setkeyv() 의 key 자리에 직접 key를 입력해도 동일한
## 결과를 보여줍니다.
key = c("cut", "color")
setkeyv(diaDT, key)
tables()
##      NAME         NROW MB COLS                                           
## [1,] diaDT      53,940 4  carat,cut,color,clarity,depth,table,price,x,y,z
## [2,] diaDT.prem 13,791 1  cut,carat,color,clarity,depth,table,price,x,y,z
##      KEY      
## [1,] cut,color
## [2,] cut      
## Total: 5MB



# 자신이 원하는 그룹만 선택하여 계산하고 자료를 가공할수있습니다.
# 예)diamonds 가격의 평균과 변 color와 cut으로 그룹지어진 변수들의 평균을
# 구합니다.
diaDT[, mean(price)]
## [1] 3933
diaDT[, mean(price), by = color]
##    color   V1
## 1:     D 3170
## 2:     E 3077
## 3:     F 3725
## 4:     G 3999
## 5:     H 4487
## 6:     I 5092
## 7:     J 5324
diaDT[, mean(price), by = cut]
##          cut   V1
## 1:      Fair 4359
## 2:      Good 3929
## 3: Very Good 3982
## 4:   Premium 4584
## 5:     Ideal 3458

# 자료에서 일부분의 변수만 따로 뽑아서 새로운 변수를 만들고 새로운
# data.table 형식의 자료를 만들수있습니다.
carat <- diaDT[, carat]
price <- diaDT[, price]
cut <- diaDT[, cut]
dia.1 <- data.table(carat, price, cut)
print(dia.1)
##        carat price   cut
##     1:  0.75  2848  Fair
##     2:  0.71  2858  Fair
##     3:  0.90  2885  Fair
##     4:  1.00  2974  Fair
##     5:  1.01  3003  Fair
##    ---                  
## 53936:  0.71  2700 Ideal
## 53937:  0.81  2708 Ideal
## 53938:  0.84  2709 Ideal
## 53939:  0.82  2741 Ideal
## 53940:  0.83  2742 Ideal

# data.frame과 마찬가지로 data를 이용할수있습니다.
gg.p <- qplot(carat, price, data = dia.1, colour = cut)
gg.p

plot of chunk unnamed-chunk-1





# ':=' 를 이용하여 data를 바로 수정할수있습니다.

diaDT.1 <- diaDT[, `:=`(Z, z + y)]  #새로운 Z변수를 만듭니다.
print(diaDT.1)
##        carat   cut color clarity depth table price    x    y    z     Z
##     1:  0.75  Fair     D     SI2  64.6    57  2848 5.74 5.72 3.70  9.42
##     2:  0.71  Fair     D     VS2  56.9    65  2858 5.89 5.84 3.34  9.18
##     3:  0.90  Fair     D     SI2  66.9    57  2885 6.02 5.90 3.99  9.89
##     4:  1.00  Fair     D     SI2  69.3    58  2974 5.96 5.87 4.10  9.97
##     5:  1.01  Fair     D     SI2  64.6    56  3003 6.31 6.24 4.05 10.29
##    ---                                                                 
## 53936:  0.71 Ideal     J     SI1  60.6    57  2700 5.78 5.83 3.52  9.35
## 53937:  0.81 Ideal     J     VS2  62.1    56  2708 5.92 5.97 3.69  9.66
## 53938:  0.84 Ideal     J     VS2  61.1    57  2709 6.09 6.12 3.73  9.85
## 53939:  0.82 Ideal     J     VS2  61.6    56  2741 6.00 6.04 3.71  9.75
## 53940:  0.83 Ideal     J     VS2  62.3    55  2742 6.01 6.03 3.75  9.78
diaDT.1 <- diaDT[, `:=`(Z, NULL)]  #Z변수를 제거 합니다.
print(diaDT.1)
##        carat   cut color clarity depth table price    x    y    z
##     1:  0.75  Fair     D     SI2  64.6    57  2848 5.74 5.72 3.70
##     2:  0.71  Fair     D     VS2  56.9    65  2858 5.89 5.84 3.34
##     3:  0.90  Fair     D     SI2  66.9    57  2885 6.02 5.90 3.99
##     4:  1.00  Fair     D     SI2  69.3    58  2974 5.96 5.87 4.10
##     5:  1.01  Fair     D     SI2  64.6    56  3003 6.31 6.24 4.05
##    ---                                                           
## 53936:  0.71 Ideal     J     SI1  60.6    57  2700 5.78 5.83 3.52
## 53937:  0.81 Ideal     J     VS2  62.1    56  2708 5.92 5.97 3.69
## 53938:  0.84 Ideal     J     VS2  61.1    57  2709 6.09 6.12 3.73
## 53939:  0.82 Ideal     J     VS2  61.6    56  2741 6.00 6.04 3.71
## 53940:  0.83 Ideal     J     VS2  62.3    55  2742 6.01 6.03 3.75
# 새로운 변수를 바로 만들어 추가할수있습니다.
diaDT.1 <- diaDT[, `:=`(zy, z * y)]
print(diaDT.1)
##        carat   cut color clarity depth table price    x    y    z    zy
##     1:  0.75  Fair     D     SI2  64.6    57  2848 5.74 5.72 3.70 21.16
##     2:  0.71  Fair     D     VS2  56.9    65  2858 5.89 5.84 3.34 19.51
##     3:  0.90  Fair     D     SI2  66.9    57  2885 6.02 5.90 3.99 23.54
##     4:  1.00  Fair     D     SI2  69.3    58  2974 5.96 5.87 4.10 24.07
##     5:  1.01  Fair     D     SI2  64.6    56  3003 6.31 6.24 4.05 25.27
##    ---                                                                 
## 53936:  0.71 Ideal     J     SI1  60.6    57  2700 5.78 5.83 3.52 20.52
## 53937:  0.81 Ideal     J     VS2  62.1    56  2708 5.92 5.97 3.69 22.03
## 53938:  0.84 Ideal     J     VS2  61.1    57  2709 6.09 6.12 3.73 22.83
## 53939:  0.82 Ideal     J     VS2  61.6    56  2741 6.00 6.04 3.71 22.41
## 53940:  0.83 Ideal     J     VS2  62.3    55  2742 6.01 6.03 3.75 22.61