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