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

Rの解析に役に立つ記事
スポンサーリンク

解析の際に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)))
#&#20966;&#29702;&#26178;&#38291;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
1.980      0.201      2.184 

###&#27604;&#36611;&#12289;&#21516;&#12376;&#20869;&#23481;&#12434;data.frame&#12467;&#12510;&#12531;&#12489;&#12391;&#20316;&#25104;#####
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)))
#&#20966;&#29702;&#26178;&#38291;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
2.102      0.132      2.236 
########

#data.table&#12467;&#12510;&#12531;&#12489;&#12391;&#20316;&#25104;&#12373;&#12428;&#12427;&#20869;&#23481;
#&#22522;&#26412;data.frame&#12392;&#21516;&#12376;&#12367;&#25805;&#20316;&#12364;&#12391;&#12365;&#12414;&#12377;
#&#12383;&#12384;&#12375;&#12289;&#21015;&#12398;&#36984;&#25246;&#12395;&#12399;&#27880;&#24847;&#12364;&#24517;&#35201;&#12391;&#12377;
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

#&#21015;&#12434;&#34920;&#31034;&#12377;&#12427;&#22580;&#21512;:with&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12392;&#21516;&#12376;&#25351;&#23450;&#12391;&#12399;&#34920;&#31034;&#12373;&#12428;&#12414;&#12379;&#12435;
TestDT[, 3]
[1] 3
#with&#12458;&#12503;&#12471;&#12519;&#12531;&#12434;&#36969;&#24540;
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&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12398;&#20869;&#23481;&#30906;&#35469;:tables&#12467;&#12510;&#12531;&#12489;
#&#20840;DT&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12398;&#24773;&#22577;&#12364;&#34920;&#31034;&#12373;&#12428;&#12414;&#12377;
tables()
NAME         NROW NCOL  MB COLS                          KEY
[1,] TestDT 10,000,000    5 268 Group,Data1,Data2,Data3,Data4    
Total: 268MB

#DT&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#20869;&#12398;&#12487;&#12540;&#12479;&#12463;&#12521;&#12473;&#12434;&#30906;&#35469;
sapply(TestDT,class)
Group       Data1       Data2       Data3       Data4 
"character"   "integer"   "numeric"   "integer"   "integer"

#&#12461;&#12540;&#12398;&#35373;&#23450;:setkey&#12467;&#12510;&#12531;&#12489;
#&#35079;&#25968;&#12461;&#12540;&#12434;&#35373;&#23450;&#12377;&#12427;&#12392;&#12365;&#12399;&#12300;setkeyv&#12301;&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12375;&#12414;&#12377;
#&#12461;&#12540;&#12434;&#35373;&#23450;&#12377;&#12427;&#12371;&#12392;&#12391;&#12487;&#12540;&#12479;&#12398;&#12495;&#12531;&#12489;&#12522;&#12531;&#12464;&#12364;&#21521;&#19978;&#12375;&#12414;&#12377;
setkeyv(TestDT, c("Group", "Data2"))
#tables&#12467;&#12510;&#12531;&#12489;&#12391;&#30906;&#35469;
tables()
NAME         NROW NCOL  MB COLS                          KEY        
[1,] TestDT 10,000,000    5 268 Group,Data1,Data2,Data3,Data4 Group,Data2
Total: 268MB
#&#12461;&#12540;&#12391;&#12487;&#12540;&#12479;&#12434;&#26908;&#32034;
system.time(head(TestDT[Group == "Group1" | Data2 &lt; -.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
#&#20966;&#29702;&#26178;&#38291;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
0.619      0.029      0.648 
#&#21516;&#12376;&#25805;&#20316;&#12434;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12391;subset&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;
#TestDT&#12434;&#12461;&#12540;&#12391;&#26908;&#32034;&#12377;&#12427;&#26041;&#12364;&#32004;2&#20493;&#20966;&#29702;&#12364;&#26089;&#12356;&#12391;&#12377;
system.time(head(subset(TestDF, TestDF[, 1] == "Group1" | TestDF[, 2] &lt; -.6)))
#&#20966;&#29702;&#26178;&#38291;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
1.529      0.229      1.772 

#mult&#12458;&#12503;&#12471;&#12519;&#12531;
#&#21021;&#12417;&#12398;&#12487;&#12540;&#12479;&#12434;&#34920;&#31034;
TestDT["Group1",mult = "first"]
Group Data1     Data2 Data3 Data4
1: Group1    42 -5.435641    33     6
#&#26368;&#24460;&#12398;&#12487;&#12540;&#12479;&#12434;&#34920;&#31034;
TestDT["Group1",mult = "last"]
Group Data1    Data2 Data3 Data4
1: Group1    55 4.776077    68    51

#&#21015;&#12398;&#21512;&#35336;&#12434;&#31639;&#20986;
TestDT[, sum(Data1)]
[1] 504973149

#Group&#27598;&#12398;&#21512;&#35336;&#12434;&#31639;&#20986;:by&#12458;&#12503;&#12471;&#12519;&#12531;
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
#&#20966;&#29702;&#26178;&#38291;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
0.104      0.006      0.110 

system.time(tapply(TestDF$Data1, TestDF$Group, sum))
#&#20966;&#29702;&#26178;&#38291;
#TestDT&#12434;&#20966;&#29702;&#12377;&#12427;&#26041;&#12364;&#32004;6&#20493;&#26089;&#12356;&#12391;&#12377;
&#12518;&#12540;&#12470;   &#12471;&#12473;&#12486;&#12512;       &#32076;&#36942;  
0.659      0.063      0.723 

#DT&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12399;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12392;&#21516;&#12376;&#25805;&#20316;&#12364;&#12391;&#12365;&#12414;&#12377;
#ggplot2&#12418;&#12356;&#12388;&#12418;&#36890;&#12426;&#12395;&#20351;&#12360;&#12414;&#12377;
library("ggplot2")
PlotTestDT <- TestDT[1:100,]
PlotData <- ggplot(PlotTestDT, aes(PlotTestDT$Data1, PlotTestDT$Data2))
PlotData + geom_point()

出力例

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

ggplot

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

タイトルとURLをコピーしました