No.21623 【R】行列のデータハンドリング  【赤羽】 2015/04/25(Sat) 13:44

青木先生,
赤羽と申します,ご教示をよろしくお願いいたします。

過日は,
【R】行和と列和がゼロになる,行と列の一括削除
で,大変に良い勉強をさせていただきました。

この関連で,ご教示いただきたいことがございます。

【背景】
テキストマイニングの,文書−語の大規模な行列を扱います。
一部を,添付ファイル(画像)にて,お示しをします。
・行方向; 文書
・列方向; 語
・セル ; 文書に語が出現する度数

文書−語の行列は,0が多い疎な行列ですので,データ圧縮のために,
0以外の値があるセルのみを,2種類の変数(term,doc)で表現する
ことを考えています。

・term(ベクトル型)
  ・ベクトルの長さ;文書−語の行列の,語の数
  ・要素;語
   【例示】"企業" "物価" 2金融" "需要" "基調" など

・doc(リスト型);
  ・リストの長さ;文書の数
  ・要素;各文書について,0以外の値があるセルの情報を行列で持ちます
     ・行列の大きさ
       行=2
         1行目は,0以外の値がある列(語)の番号
         2行目は,セルの値
       列=0以外の値があるセルの値
   【例示】
     doc[[1]]
       6,13,15,16,17,,,,
       1, 1, 1, 1, 1,,,,
     doc[[20]]
       4,5,,,,,
       1,1,,,,,

以下のようなRプログラムを作成しましたが,
大規模なデータですので,性能効能のために,
もっと効率の良い書き方がないか,ご教示いただければ助かります。
(特に,ループの回避)

dat <- read.table("doc_term.csv",header=T, row=1, sep=",")

tate <- nrow(dat)
yoko <- ncol(dat)

term <- colnames(dat)

ban <- 1:yoko

doc <- as.list(NA)

for (i in 1:tate) {
vec <- dat[i,]
s <- (vec >= 1)
ban1 <- ban[s]
vec1 <- vec[s]
m1 <- rbind(ban1,vec1)
doc[[i]] <- m1
}

以上,どうぞよろしくお願いいたします。


No.21626 Re: 【R】行列のデータハンドリング  【青木繁伸】 2015/04/25(Sat) 20:57

dat にデータを読み込んだ後
以下の一文を
> doc <- apply(dat, 1, function(x) {ban1 <- which(x > 0); vec1 <- x[ban1]; rbind(ban1, vec1)})

実行結果

> head(doc)
$`1`
金利
ban1 9
vec1 2

$`2`
需要 国内
ban1 5 11
vec1 1 2

$`3`
金利 価格
ban1 9 12
vec1 1 1

> doc[[1]]
金利
ban1 9
vec1 2

No.21627 【御礼】 Re: 【R】行列のデータハンドリング  【赤羽】 2015/04/25(Sat) 21:31

青木先生,
赤羽と申します,ご教示をいただき誠にありがとうございます。

まさか,本当にループを回避できるとは,驚きました。

『はじめてのR: ごく初歩の操作から統計解析の導入まで』村井潤一郎(北大路書房/2013年)
の中に,
apply族については,青木先生の著書がとても詳しい,
と書かれていた記憶がございますが,本当にその通りでした。

勇気を振り絞って,投稿させていただき,大変に良い勉強をさせていただきました。
心から,心より,御礼を申し上げます,

● 「統計学関連なんでもあり」の過去ログ--- 047 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る