Я хотел бы сделать иерархическую кластеризацию по строке, а затем по столбцу. Я придумал этот полный взлом решения:
#! /path/to/my/Rscript --vanilla
args <- commandArgs(TRUE)
mtxf.in <- args[1]
clusterMethod <- args[2]
mtxf.out <- args[3]
mtx <- read.table(mtxf.in, as.is=T, header=T, stringsAsFactors=T)
mtx.hc <- hclust(dist(mtx), method=clusterMethod)
mtx.clustered <- as.data.frame(mtx[mtx.hc$order,])
mtx.c.colnames <- colnames(mtx.clustered)
rownames(mtx.clustered) <- mtx.clustered$topLeftColumnHeaderName
mtx.clustered$topLeftColumnHeaderName <- NULL
mtx.c.t <- as.data.frame(t(mtx.clustered), row.names=names(mtx))
mtx.c.t.hc <- hclust(dist(mtx.c.t), method=clusterMethod)
mtx.c.t.c <- as.data.frame(mtx.c.t[mtx.c.t.hc$order,])
mtx.c.t.c.t <- as.data.frame(t(mtx.c.t.c))
mtx.c.t.c.t.colnames <- as.vector(names(mtx.c.t.c.t))
names(mtx.c.t.c.t) <- mtx.c.colnames[as.numeric(mtx.c.t.c.t.colnames) + 1]
write.table(mtx.c.t.c.t, file=mtxf.out, sep='\t', quote=F, row.names=T)
Переменные mtxf.in
и mtxf.out
представляют файлы входной матрицы и кластеризованной выходной матрицы соответственно. Переменная clusterMethod
является одним из hclust
методов, таких как single
, average
и т. Д.
В качестве примера ввода приведена матрица данных:
topLeftColumnHeaderName col1 col2 col3 col4 col5 col6
row1 0 3 0 0 0 3
row2 6 6 6 6 6 6
row3 0 3 0 0 0 3
row4 6 6 6 6 6 6
row5 0 3 0 0 0 3
row6 0 3 0 0 0 3
Запустив этот скрипт, я теряю свой левый верхний угловой элемент с mtxf.in
. Вот вывод, который получается из этого скрипта:
col5 col4 col1 col3 col2 col6
row6 0 0 0 0 3 3
row5 0 0 0 0 3 3
row1 0 0 0 0 3 3
row3 0 0 0 0 3 3
row2 6 6 6 6 6 6
row4 6 6 6 6 6 6
Мои вопросы: В дополнение к поиску способа сохранения исходной структуры файла входной матрицы, я также не знаю, сколько памяти это потребляет или есть ли более быстрые и чистые, более "R" -подобные способы для этого.
Неужели действительно так сложно кластеризовать по строкам и столбцам в R? Есть ли конструктивные способы улучшить этот скрипт? Спасибо за ваш совет.