No.22459 R 表の突合せ集計  【明石】 2017/10/22(Sun) 18:08

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

昨日は,ネットワーク分析igraphパッケージの計算結果の取り出し,組み立てについて
ご教示をいただきまして,誠にありがとうございました。

改めて御礼を申し上げます。

また,Rについてお聞きしたいことがでてきました。
ご教示をいただければ,大変に助かります。
何卒どうぞよろしくお願いいたします。

-----------

添付画像をご覧ください。

表1と表2を突き合わせて,表3を出力します。

表1と表2はともに大規模データであることから,効率的な方法をご教示いただければ
大変に助かります。

表1は,wordとgroupの関係を示しています。 マスター表の位置づけです。
AとBは,g1に,
CとDは,g2に
EとFとGは,g3に属していることを示しています。

表2は,3つの文書があり,
各文書にwordが含まれるかどうかを,0/1の2値で示しています。

表2には,表1には含まれないwordも出現します。
(ここでは,H,P,X)

表1と表2を突き合わせて,
表2の各文書に出現するwordを,表1を参照して,wordが属するgroup単位に度数を集計して,表3を出力します。

表1と表2はともに大規模データであることから,効率的な方法をご教示いただければ
大変に助かります。

お手数をおかけいたします。
どうぞ,よろしくお願いいたします。


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({
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))
})
おそらく,もっとシンプルな for ループを使ったプログラムでも,そこそこの実行時間ではないかと思います。

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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る