解析の際に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もいつも通りに使えます

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