More Related Content
More from Shintaro Fukushima
More from Shintaro Fukushima (20)
data.tableパッケージで大規模データをサクッと処理する
- 8. そんなデータフレームも,
結構処理が遅いことがある
> # データの読み込み
> system.time(usc.df <read.csv("../data/USCensus1990.data.txt"))
ユーザ
システム
経過
65.588 3.152
68.868
⽶国の1990年の国勢調査データ
出典:US Census(1990) Data Set
http://archive.ics.uci.edu/ml/datasets/US
+Census+Data+%281990%29
7
- 16. データの⼊⼒
� 読み込んだデータテーブルの確認(⾏頭・⾏末)
> head(usc.dt)
caseid dAge dAncstry1 dAncstry2 iAvail iCitizen iClass dDepart ...
1: 10000
5
0
1
0
0
5
3 ...
2: 10001
6
1
1
0
0
7
5 ...
3: 10002
3
1
2
0
0
7
4 ...
4: 10003
4
1
2
0
0
1
3 ...
5: 10004
7
1
1
0
0
0
0 ...
6: 10005
1
1
2
0
0
0
0 ...
> tail(usc.dt)
caseid dAge dAncstry1 dAncstry2 iAvail iCitizen iClass dDepart ...
1: 2468279
3
3
1
0
0
1
5 ...
2: 2468280
7
1
2
0
0
0
0 ...
3: 2468281
1
1
2
0
0
0
0 ...
4: 2468282
3
3
1
0
0
1
2 ...
5: 2468283
6
0
1
0
0
1
3 ...
6: 2468284
2
3
1
0
4
0
0 ...
15
- 17. データの⼊⼒
� 読み込んだデータテーブルの確認(サイズ,表頭・表側)
> dim(usc.dt)
[1] 2458285
69
> dimnames(usc.dt)
[[1]]
NULL
[[2]]
[1] "caseid"
[7] "iClass"
[13] "iFertil"
[19] "dIncome2"
[25] "dIncome8"
[31] "iMay75880"
[37] "iOthrserv"
[43] "dRearning"
[49] "iRownchld"
[55] "iSchool"
[61] "dTravtime"
[67] "iYearsch"
"dAge"
"dDepart"
"dHispanic"
"dIncome3"
"dIndustry"
"iMeans"
"iPerscare"
"iRelat1"
"dRpincome"
"iSept80"
"iVietnam"
"iYearwrk"
表側はつかない
"dAncstry1"
"iDisabl1"
"dHour89"
"dIncome4"
"iKorean"
"iMilitary"
"dPOB"
"iRelat2"
"iRPOB"
"iSex"
"dWeek89"
"dYrsserv"
"dAncstry2"
"iDisabl2"
"dHours"
"dIncome5"
"iLang1"
"iMobility"
"dPoverty"
"iRemplpar"
"iRrelchld"
"iSubfam1"
"iWork89"
"iAvail"
"iEnglish"
"iImmigr"
"dIncome6"
"iLooking"
"iMobillim"
"dPwgt1"
"iRiders"
"iRspouse"
"iSubfam2"
"iWorklwk"
"iCitizen"
"iFeb55"
"dIncome1"
"dIncome7"
"iMarital"
"dOccup"
"iRagechld"
"iRlabor"
"iRvetserv"
"iTmpabsnt"
"iWWII"
16
- 18. データの⼊⼒
� メモリ上に⽣成されたデータテーブルのリストの確認
オブジェクト名
> tables()
NAME
NROW MB
[1,] usc.dt 2,458,285 648
⾏数
COLS
[1,]
caseid,dAge,dAncstry1,dAncstry2,iAvail,iCitizen,iClass,
dDepart,iDisabl1,iDisabl2
KEY
[1,]
表側(の⼀部)
Total: 648MB
17
- 20. データ加⼯・集計
� キーの付加(setkey関数)
# キーの付加(dAge, dIncome1 をキーにする)
setkey(usc.dt, dAge, dIncome1)
# オブジェクトのリストの中にもキーが表⽰されている
tables()
NAME
NROW MB
[1,] usc.dt 2,458,285 648
COLS
[1,]
caseid,dAge,dAncstry1,dAncstry2,iAvail,iCitizen,iClass,
dDepart,iDisabl1,iDisabl2
KEY
キーが付加された
[1,] dAge,dIncome1
Total: 648MB
>
>
>
>
19
- 21. データ加⼯・集計
� バイナリサーチを⽤いた⾼速な要素抽出
> # 2つのキーの値によりデータの要素へのアクセスが可能
> system.time(x <- usc.dt[1, 1])
ユーザ
システム
経過
0.000
0.000
0.001
dAge=1 かつ
dIncome1=1の
⾏の取得
> # ⽐較: 通常のデータフレームを⽤いた場合
> system.time(y <- usc.df[usc.df$dAge==1 &
usc.df$dIncome1==1, ])
ユーザ
システム
経過
1.536
0.096
1.637
20
- 22. データ加⼯・集計
� グループ化処理による集計
> # キーの値ごとの層別集計
> system.time(x <- usc.dt[, sum(dIncome1), by=dAge])
ユーザ
システム
経過
0.032
0.000
0.033
> x
第2引数には集計処理を,
dAge
V1
by引数には集計軸を指定
1:
0
0
2:
1
0
3:
2 89043
4:
3 462080
5:
4 638323
6:
5 525549
7:
6 415373
8:
7 74411
21
- 23. データ加⼯・集計
� グループ化処理による集計
> # ⽐較: 通常のデータフレームを⽤いた場合
> system.time(y <- tapply(usc.df$dIncome1, usc.df$dAge,
sum))
ユーザ
システム
経過
1.580 0.004
1.584
> y
0
1
2
3
4
5
6
7
0
0 89043 462080 638323 525549 415373 74411
22