「コーパス間で頻度差の大きい単語を特定する」だが...
http://t.co/aTOkCabdnT
少なくとも,mat3 への代入文は for ループの外に出さないといけない
(ソースフォーマットが悪い(ない)ので,自分で気づけない)
fisher.bat = function(x) {
sum = apply(x, 2, sum)
nr = nrow(x)
nc = ncol(x)
mat = matrix(0, nr, 1)
mat2 = cbind(x, p.value = mat)
for (i in 1:nr) {
temp = rbind(x[i, ], sum - x[i, ])
mat2[i, nc + 1] = fisher.test(temp)$p.value
mat3 = mat2[sort.list(mat2[, nc + 1]), ]
}
list(results = mat3)
}
for をなくすと共に,いろいろと無駄をなくしてみる
fisher.bat2 = function(x) {
sum = colSums(x)
y = t(sum - t(x))
p.values = apply(cbind(x, y), 1, function(temp) fisher.test(matrix(temp, 3))$p.value)
cbind(x, p.values)[order(p.values), ]
}
速くなったようだ
> system.time(fisher.bat(nouns))
ユーザ システム 経過
0.449 0.017 0.463
> system.time(fisher.bat2(nouns))
ユーザ システム 経過
0.165 0.012 0.175