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
# ':=' 를 이용하여 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