No.21978 【R】 表 〜 リスト の相互変換  【明石】 2016/04/24(Sun) 10:50

青木先生,
お忙しいところを失礼いたします,明石と申します。

過日は,Rについて,丁寧にご教示をいただきまして,誠にありがとうございました。

添付の画像ファイルについて,ご教示をいただきたく,よろしくお願いいたします。

左側は,2部グラフ(人〜本)の,表データです。

人(行)が本(列)を5段階で評価した値(セル)であり,大規模データです。

この表で,評価値(セル)が0でない,人(行)と本(列)の組み合わせを取り出して,
右側の,2部リスト(人〜本)を作成する処理を(1)とします。

逆に,
右側の2部リスト(人〜本)から,左側の2部グラフ(人〜本)を作成する処理を(2)とします。

(1),(2)の処理プログラムを作成しましたが,
ご専門家から見れば,まだまだ改良の余地が多いにあると思われますので,
改良の観点,プログラム例をお示しいただけると,勉強になります。

お手数をお掛けいたします。
どうぞ,よろしくお願いいたします。
#------------------------------------------------
# (1) 2部グラフ → 2項リスト
#------------------------------------------------

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

dat <- as.matrix(dat)

m <- nrow(dat)
n <- ncol(dat)

hito <- numeric(m*n)
book <- numeric(m*n)
score <- numeric(m*n)

cnt <- 0

for (i in 1:m) {
   for (j in 1:n) {
     if (dat[i,j] != 0) {
       cnt <- cnt + 1
       hito[cnt] <- rownames(dat)[i]
       book[cnt] <- colnames(dat)[j]
       score[cnt] <- dat[i,j]
     }
   }
}

length(hito) <- cnt
length(book) <- cnt
length(score) <- cnt

df <- data.frame(hito, book, score)

write.csv(df, "hito_book_list.csv")

#------------------------------------------------
# (2) 2項リスト → 2部グラフ
#------------------------------------------------

dat <- read.table("hito_book_list.csv", header=TRUE, sep=",", stringsAsFactors=F)

r <- nrow(dat)

hito <- dat$hito
s1 <- unique(hito)
m <- length(s1)

book <- dat$book
s2 <- unique(book)
n <- length(s2)

mx <- matrix(0, nrow=m, ncol=n)

rownames(mx) <- s1
colnames(mx) <- s2

for (i in 1:r) {
   x <-which(is.element(s1, dat$hito[i]))
   y <-which(is.element(s2, dat$book[i]))
   mx[x, y] <- dat$score[i]
}

write.csv(mx, "hito_book_table.csv")


No.21979 Re: 【R】 表 〜 リスト の相互変換  【荒】 2016/04/24(Sun) 19:58

#------------------------------------------------
# (1) 2部グラフ → 2項リスト
#------------------------------------------------

data.frame(
  hito = rep(rownames(dat), each = ncol(dat)),
  book = rep(colnames(dat), nrow(dat)),
  hyouka = as.vector(dat)
)

#------------------------------------------------
# (2) 2項リスト → 2部グラフ
#------------------------------------------------

xtabs(hyouka ~ hito + book, data = dat)
でいかがでしょうか?

No.21980 Re: 【R】 表 〜 リスト の相互変換  【明石】 2016/04/24(Sun) 20:28

荒 様;

お忙しいところを失礼いたします,明石と申します。

ご教示をいただきまして,誠にありがとうございます。

コードは,あまりにも研ぎ澄まされているため,にわかには理解できないでおります。

追試しながら,調べながら,理解させていただきます。

まずは,御礼まで。
ご親身にありがとうございました。

No.21981 Re: 【R】 表 〜 リスト の相互変換  【荒】 2016/04/24(Sun) 20:48

明石さん

1番目のコードですが,行と列を入れ替えないと駄目でした。
data.frame(
hito = rep(rownames(dat), each = ncol(dat)),
book = rep(colnames(dat), nrow(dat)),
hyouka = as.vector(t(dat))              # <= t(dat) に修正
)
評価が0の行が不必要な場合にはこの後にsubset関数で除去して下さい。

rep関数の使用方法さえ分かれば理解できると思います。
また,datの行と列の両方ともラベルがついていないと失敗します。
おそらく他にもっと簡単なやり方があるかもしれません。

No.21982 Re: 【R】 表 〜 リスト の相互変換  【青木繁伸】 2016/04/25(Mon) 19:02

(1) 2部グラフ → 2項リスト は,以下のようにも書けますね。
速いかどうかは見ていません。
dat2 = t(dat)
index = which(dat2 > 0, arr.ind=TRUE)
data.frame(人=colnames(dat2)[index[,2]], 本=rownames(index), 評価=dat2[index])

No.21983 【御礼】 Re: 【R】 表 〜 リスト の相互変換  【明石】 2016/04/25(Mon) 21:33

青木先生 様,荒 様;

お忙しいところを失礼いたします,明石と申します。

今回も,親身に,ご相談にのってくださり,誠にありがとうございました。

荒様からご教示いただきました内容は,追試し,調査して,理解できました。
今後,使いこなしができます。
ありがとうございました。

青木先生からご教示いただきました内容は,にわかには理解できませんので,
じっくりと勉強させていただき,技をマスターしたいと思います。
ありがとうございました。

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