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() [/code]


出力例

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


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

スポンサードリンク

関連コンテンツ


スポンサードリンク