Rで解析:大規模データのハンドリングを効率化!!「data.table」パッケージ


解析の際にdata.frameクラスを利用されていませんか。data.frameクラスに適応できるコマンドが使え、格段に処理が早い「data.table」クラスを作成する「data.table」パッケージの紹介です。大規模データのハンドリングが楽になります。

もちろん、data.tableクラスはdata.frameと同様にggplot2だけでなく多くのパッケージで利用が可能です。

実行コマンドの紹介では10,000,000行*5列のデータ例で処理しています。一部作業は、data.frameとの処理時間を比較しています。

パッケージのバージョンは1.9.4。R version 3.2.1でコマンドを確認しています。


パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("data.table")

実行コマンド

詳細はコマンド、パッケージヘルプを確認してください。

#パッケージの読み込み
library("data.table")

#データテーブル(DT)クラスの作成:data.tableコマンド
n <- 10000000
system.time(TestDT <- data.table(Group = sample(paste0("Group", 1:10), n, replace = TRUE),
                                 Data1 = sample(1:100, n, replace = TRUE),
                                 Data2 = rnorm(n),
                                 Data3 = sample(1:100, n, replace = TRUE),
                                 Data4 = sample(1:100, n, replace = TRUE)))
#処理時間
ユーザ   システム       経過  
1.980      0.201      2.184 

###比較、同じ内容をdata.frameコマンドで作成#####
system.time(TestDF <- data.frame(Group = sample(paste0("Group", 1:10), n, replace = TRUE),
                                 Data1 = sample(1:100, n, replace = TRUE),
                                 Data2 = rnorm(n),
                                 Data3 = sample(1:100, n, replace = TRUE),
                                 Data4 = sample(1:100, n, replace = TRUE)))
#処理時間
ユーザ   システム       経過  
2.102      0.132      2.236 
########

#data.tableコマンドで作成される内容
#基本data.frameと同じく操作ができます
#ただし、列の選択には注意が必要です
head(TestDT)
    Group Data1     Data2 Data3 Data4
1: Group1    42 -5.435641    33     6
2: Group1    14 -4.926774    10    47
3: Group1    72 -4.766467    18    88
4: Group1    14 -4.630131     4    63
5: Group1    87 -4.623438    92    58
6: Group1    94 -4.553732    46    81

#列を表示する場合:withオプション
#データフレームと同じ指定では表示されません
TestDT[, 3]
[1] 3
#withオプションを適応
head(TestDT[, 3, with = FALSE])
     Data2
1: -5.435641
2: -4.926774
3: -4.766467
4: -4.630131
5: -4.623438
6: -4.553732

#DTオブジェクトの内容確認:tablesコマンド
#全DTオブジェクトの情報が表示されます
tables()
     NAME         NROW NCOL  MB COLS                          KEY
[1,] TestDT 10,000,000    5 268 Group,Data1,Data2,Data3,Data4    
Total: 268MB

#DTオブジェクト内のデータクラスを確認
sapply(TestDT,class)
      Group       Data1       Data2       Data3       Data4 
"character"   "integer"   "numeric"   "integer"   "integer"

#キーの設定:setkeyコマンド
#複数キーを設定するときは「setkeyv」コマンドを使用します
#キーを設定することでデータのハンドリングが向上します
setkeyv(TestDT, c("Group", "Data2"))
#tablesコマンドで確認
tables()
     NAME         NROW NCOL  MB COLS                          KEY        
[1,] TestDT 10,000,000    5 268 Group,Data1,Data2,Data3,Data4 Group,Data2
Total: 268MB
#キーでデータを検索
system.time(head(TestDT[Group == "Group1" | Data2 < -.6,]))
    Group Data1     Data2 Data3 Data4
1: Group1    42 -5.435641    33     6
2: Group1    14 -4.926774    10    47
3: Group1    72 -4.766467    18    88
4: Group1    14 -4.630131     4    63
5: Group1    87 -4.623438    92    58
6: Group1    94 -4.553732    46    81
#処理時間
ユーザ   システム       経過  
0.619      0.029      0.648 
#同じ操作をデータフレームでsubsetコマンドを使用
#TestDTをキーで検索する方が約2倍処理が早いです
system.time(head(subset(TestDF, TestDF[, 1] == "Group1" | TestDF[, 2] < -.6)))
#処理時間
ユーザ   システム       経過  
1.529      0.229      1.772 

#multオプション
#初めのデータを表示
TestDT["Group1",mult = "first"]
    Group Data1     Data2 Data3 Data4
1: Group1    42 -5.435641    33     6
#最後のデータを表示
TestDT["Group1",mult = "last"]
    Group Data1    Data2 Data3 Data4
1: Group1    55 4.776077    68    51

#列の合計を算出
TestDT[, sum(Data1)]
[1] 504973149

#Group毎の合計を算出:byオプション
system.time(TestDT[, sum(Data1), by = Group])
     Group       V1
1:  Group1 50496662
2: Group10 50508179
3:  Group2 50477910
4:  Group3 50626233
5:  Group4 50545596
6:  Group5 50491929
7:  Group6 50494935
8:  Group7 50394726
9:  Group8 50397513
10: Group9 50539466
#処理時間
ユーザ   システム       経過  
0.104      0.006      0.110 

system.time(tapply(TestDF$Data1, TestDF$Group, sum))
#処理時間
#TestDTを処理する方が約6倍早いです
ユーザ   システム       経過  
0.659      0.063      0.723 

#DTオブジェクトはデータフレームオブジェクトと同じ操作ができます
#ggplot2もいつも通りに使えます
library("ggplot2")
PlotTestDT <- TestDT[1:100,]
PlotData <- ggplot(PlotTestDT, aes(PlotTestDT$Data1, PlotTestDT$Data2))
PlotData + geom_point()

出力例

・ggplot2もいつも通りに使えます
ggplot


少しでも、あなたのウェブや実験の解析が楽になりますように!!

スポンサードリンク

おすすめコンテンツ


スポンサードリンク