mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

クラスタリングとヒートマップをexcel形式で出力

Rで結果を出力するときwrite.table()を使って
CSV形式で出力するのが楽だが、
結果をExcelでくれ!ってなる場合もある

それにクラスタリングした結果を並べ替えたり
色を付けなおしたりするにはExcel便利

なので一度Rで計算して結果をExcelファイルに出力する

Excel形式で出力するライブラリがこれ

library(openxlsx)

を使う

例えば前回やったクラスタリングの結果を
Excel形式で出力するときに使っているコードはこちら

WriteClusteringinXlsx <- function(Data.All){

  # 行名の取得
  Sp.Name <- rownames(Data.All)

  # 距離の計算
  Dist.Data <- dist(Data.All, method = "euclidean")
  # クラスタリング
  Clust.Data <- hclust(Dist.Data, method = "ward.D2")

  # クラスタリングの結果に行名を付ける
  Clust.Order <- Clust.Data$order
  Clust.Order <- t(rbind(seq(length(Clust.Order)), Clust.Order))
  Clust.Order <- as.data.frame(Clust.Order)
  colnames(Clust.Order) <- c("num", "hc")
  Clust.Order <- cbind(Clust.Order[order(Clust.Order$hc),], Sp.Name, Data.All)
  Clust.Order <- Clust.Order[order(Clust.Order$num),]
  Clust.Order <- Clust.Order[, c(-1)]
 
  # クラスタリングの履歴をクラスタリングの結果と結合する
  Clust.Height <- cbind(Clust.Data$merge, 
    format(Clust.Data$height, digit = 3, scientific = TRUE))
  Clust.Height <- rbind(Clust.Height, c(NA, NA, NA))
  colnames(Clust.Height) <- c("Element1", "Element2", "Height")
  Clust.Height <- cbind(Clust.Order, Clust.Height)

  # Excel形式での出力
  Excel.Workbook <- createWorkbook()
  Workbook.Name = sprintf("Cluster.xlsx")
  Sheet.Name = sprintf("IRIS")

  addWorksheet(Excel.Workbook, sheetName = Sheet.Name)
  writeData(Excel.Workbook, sheet = Sheet.Name, x = Clust.Height)
  saveWorkbook(Excel.Workbook, Workbook.Name, overwrite = TRUE)

}

Excel形式での出力はまず
createWorkbook()でワークブックを作って、
addWorksheet()でシートを足す
データの書き込みはwriteData()で行う
引数のxが書き込むデータになる
saveWorkbook()で保存してファイルを閉じる
ファイルが開いているとエラーが出る
openxlsx package | R Documentation
RとExcel(ファイルの読み書き、データフレームをExcelで編集) | marketechlabo
R で openxlsx パッケージを用いて xlsx ファイルを扱う - Qiita

pheatmap()でクラスタリングの結果を出力する方法がわからなかったので
dist()とhist()で距離の計算とクラスタリングを行っている
クラスタリング後は種の行の名前がなくなるのでつけ直している
元データは前回と同じでiris

# データの用意
Data.Iris <- iris
Par.List <- colnames(Data.Iris)
Sp.Num <- paste(Sp.Names, rep(1:50, 3), sep = ", ")
d <- Data.Iris[1:4]
rownames(d) <- Sp.Num

# Excel形式で出力
WriteClusteringinXlsx(d)

結果はこちら

hc Sp.Name Sepal.Length Sepal.Width Petal.Length Petal.Width Element1 Element2 Height
1 36 setosa, 36 5 3.2 1.2 0.2 -102 -143 0.00e+00
2 13 setosa, 13 4.8 3 1.4 0.1 -8 -40 1.00e-01
3 2 setosa, 2 4.9 3 1.4 0.2 -1 -18 1.00e-01
~中略~
148 86 versicolor, 36 6 3.4 4.5 1.6 146 147 1.23e+01
149 52 versicolor, 2 6.4 3.2 4.5 1.5 145 148 3.24e+01
150 57 versicolor, 7 6.3 3.3 4.7 1.6

はてな記法で表組みは簡単だけど手間が多い
表組みをつくる(表組み記法) - はてなダイアリーのヘルプ

hcがhclust()のクラスタリングの結果でクラスタリングする前の行番号を表す
行番号が並べ替えられてしまうので種の名前もつけた
Element1/2はクラスタリングの履歴でHeightは距離を示す
R: Hierarchical Clustering

2つの場合はユークリッド距離だけどクラスター同士の計算方法がわからなかった
ヒートマップはExcelでも表示可能
"ホーム" -> "条件付き書式" -> "新しいルール”
で最小値・最大値を数値にすれば同じRと同じように表示できる
f:id:mecobalamin:20180926110023p:plain