No.22293 R 状態遷移を表形式で整理(2)  【明石】 2017/03/05(Sun) 17:31

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

昨日〜本日と,件名「状態遷移を表形式で整理」について,
有難いご教示をいただきまして,誠にありがとうございました。
御礼を申し上げます。

その継続について検討を進めています。

私の方でもプログラムを作成していますが,苦慮しております。
またご教示いただれば,大変に助かります。

何卒どうぞ,よろしくお願いいたします。

ーーーーーーー

今回は,Webページのコンテンツの遷移を,
・縦方向に,遷移前のコンテンツ名
・横方向に,遷移後のコンテンツ名
・セルに,出現度数
からなる表形式で整理したいと思います。

今回の例示では,コンテンツの状態遷移が17行です,
n05 > n07 > n01 > n05
n05 > n05 > n05
n02 > n05
n07 > n02 > n05 > n02 > n05
n05
n03 > n05
n07 > n07 > n02
n02 > n02 > n04 > n06 > n01
n02 > n01 > n02 > n01 > n04 > n02
n06 > n02 > n02 > n06 > n01 > n02 > n06 > n01
n07 > n06 > n06
n04 > n03
n07 > n05 > n01 > n01
n02 > n04 > n04 > n02
n05 > n06 > n01 > n02
n05 > n02 > n02
n02 > n07 > n01 > n01 > n01
これを読み取り,画像ファイルにお示しをします表を出力したいと思います。

以下の手順でプログラムを作成するつもりです。
誠に恥ずかしいのですが,リストのハンドリングが不得手ですので,最初の(1)で足踏み状態です。

(1)
各行の状態遷移を読み取り,遷移の前後の対を出力する。

例えば,
"n05 > n07 > n01 > n05" では,
"n05_n07" , "n07_n01" , "n01_n05" のように,
遷移前のコンテンツ,遷移後のコンテンツを,"_"で連結した文字列を出力します。

ただし,以下の2つの場合は,無視します。。
・ "n05 > n05" のように,同じコンテンツが連続する場合
・ "n05" のように,1行でコンテンツが1つの場合


(2)
青木先生からご教示いただきましたと同じ方法で,表を出力します。

縦方向は,セッション
横方向は,遷移の前後の対の文字列

(3)
上記の表で,行和が 0 の行を削除する。

つまり,以下の場合です。
・1行に1つのコンテンツしかない場合
・1行に複数のコンテンツがあるが,すべて同じ種類の場合

(4)
上記の表で,列和をとる。

(5)
上記の表から,列名と列和の2列からなるデータフレームを作成する。

2列の変数名です。
mae_ato, freq

(6)
上記のデータフレームで,
変数 mae_ato を strsplit() 関数で分割した,3列を作成する。

3列の変数名です。
mae, ato, freq

(7)
上記のデータフレームで,xtab()関数を用いて,クロス表を作成する。

縦方向は,mae
横方向は,ato
セルは,freq

これが最終的に求める表です。

青木先生は,研ぎ澄まされた本質的でスマートなプログラムを作成されますので,
ご教示いただけましたら,大変に良い勉強となります。

お手数をお掛けいたしますが,ご教示を頂戴できましたら助かります。

何卒どうぞ,よろしくお願いいたします。


No.22294 Re: R 状態遷移を表形式で整理(2)  【青木繁伸】 2017/03/05(Sun) 21:24

以下のように(前のプログラム方針とちょっと違うところがあるが,まあそれはそれ)
func <- function(s) {
s <- strsplit(s, " > ")
nameOfContents <- names(table(unlist(s)))
numberOfContents <- length(nameOfContents)
tbl <- matrix(0, numberOfContents, numberOfContents)
colnames(tbl) <- rownames(tbl) = nameOfContents
for (S in s) {
a <- unlist(S)
n <- length(a)
for (i in seq_len(n - 1)) {
if (a[i] != a[i + 1]) {
tbl[a[i], a[i + 1]] <- tbl[a[i], a[i + 1]] + 1
}
}
}
tbl
}

func(c("n05 > n07 > n01 > n05",
"n05 > n05 > n05",
"n02 > n05",
"n07 > n02 > n05 > n02 > n05",
"n05",
"n03 > n05",
"n07 > n07 > n02",
"n02 > n02 > n04 > n06 > n01",
"n02 > n01 > n02 > n01 > n04 > n02",
"n06 > n02 > n02 > n06 > n01 > n02 > n06 > n01",
"n07 > n06 > n06",
"n04 > n03",
"n07 > n05 > n01 > n01",
"n02 > n04 > n04 > n02",
"n05 > n06 > n01 > n02",
"n05 > n02 > n02",
"n02 > n07 > n01 > n01 > n01"))
実行結果
    n01 n02 n03 n04 n05 n06 n07
n01 0 3 0 1 1 0 0
n02 2 0 0 2 3 2 1
n03 0 0 0 0 1 0 0
n04 0 2 1 0 0 1 0
n05 1 2 0 0 0 1 1
n06 4 1 0 0 0 0 0
n07 2 2 0 0 1 1 0

No.22295 Re: R 状態遷移を表形式で整理(2)  【明石】 2017/03/06(Mon) 09:29

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

今回も,研ぎ澄まされたプログラムをご教示いただきまして,誠にありがとうございました。

確認いたしました。

ご教示くださいました2種類のプログラム,しっかりと勉強させていただきます。

心から御礼を申し上げます。

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