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