No.22460 Re: R 表の突合せ集計 【青木繁伸】 2017/10/22(Sun) 21:36
仮想的な大規模データを生成するプログラムと,その大規模データを処理する「標準的」プログラムを提示いただけれ ば,その「標準的」プログラムよりどの程度優秀なプログラムであるかを提案できると思います。こちらが思い浮かべたプログラムが「標準的」プログラムより 劣っていれば,申し訳ないですから。
No.22461 Re: R 表の突合せ集計 【青木繁伸】 2017/10/22(Sun) 23:05
表1のサイズが 20×2
表2のサイズが 1000000×26
のときの実行時間が 0.907 秒でした
example = FALSE で,あなたの提示したテストデータでの結果が表示されますsystem.time({おそらく,もっとシンプルな for ループを使ったプログラムでも,そこそこの実行時間ではないかと思います。
set.seed(12345)
exampe = TRUE
if (exampe) {
l = 20
g = sort(sample(5, l, replace=TRUE))
tbl1 = data.frame(word=LETTERS[1:20], group=sprintf("g%02i", g))
o = order(tbl1[,2])
tbl1 = tbl1[o,]
} else {
l = 7
tbl1 = data.frame(word=LETTERS[1:7], group=paste("g", c(1,1,2,2,3,3,3), sep=""))
}
print(tbl1)
print(dim(tbl1))
if (exampe) {
m = 1000000
n = 26
tbl2 = cbind(1:m, matrix(sample(0:1, m*n, replace=TRUE), m, n))
colnames(tbl2) = c("ban", LETTERS)
head(tbl2, 20)
} else {
m = 3
n = 10
tbl2 = matrix(c(1,1,0,1,0,0,0,1,0,0,1,1,1,0,1,0,0,1,0,1,1,1,0,0,0,1,0,0,0,1), 3, 10)
dimnames(tbl2) = list(1:3, c(LETTERS[1:7], "H", "P", "X"))
}
head(tbl2)
print(dim(tbl2))
tbl = xtabs(~word+group, tbl1)
ans = matrix(0, m, ncol(tbl)+1)
for (i in 1:ncol(tbl)+1) {
name = rownames(tbl)[tbl[,i-1] == 1]
ans[, i] = rowSums(tbl2[,name])
}
ans[,1] = tbl2[,1]
colnames(ans) = c("ban", colnames(tbl))
print(head(ans))
})
No.22462 Re: R 表の突合せ集計 【青木繁伸】 2017/10/22(Sun) 23:28
おそらく,最も速いのは,データ構造を反映したcibnd(rowSums(tbl2[,1:2]), rowSums(tbl2[,3:4]), rowSums(tbl2[,5:7]))などでしょうけど
No.22463 【御礼】Re: R 表の突合せ集計 【明石】 2017/10/23(Mon) 06:10
青木先生,
いつもお世話になり,ありがとうございます,明石と申します。
色々な方法をご教示くださり,大変に良い勉強をさせていただきました。
考え方をしっかりと勉強をいたします。
ご丁寧に,ご親身に,ご教示をいただき,誠にありがとうございました。
● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る