Воспроизводимые данные:
data(crabs, package = "MASS")
df <- crabs[-(1:3)]
set.seed(12345)
df$GRP <- kmeans(df, 4)$cluster
df.order <- dplyr::arrange(df, GRP)
Описание данных:
df
имеет 5 числовых переменных.Я сделал алгоритм K-средних согласно этим 5 атрибутам и создал новую категориальную переменную GRP
, которая имеет 4 уровня.Затем я заказал его с GRP
и назвал его df.order
.
Что я сделал с pheatmap
:
## 5 numerical variables for coloring
colormat <- df.order[c("FL", "RW", "CL", "CW", "BD")]
## Specify the annotation variable `GRP` shown on left side of the heatmap
ann_row <- df.order["GRP"]
## gap indices
gapRow <- cumsum(table(ann_row$GRP))
library(pheatmap)
pheatmap(colormat, cluster_rows = F, show_rownames = F,
annotation_row = ann_row, gaps_row = gapRow)
Ошибка в annotation_colors [[colnames (annotation) [i]]]: индекс за пределами границ
Вот где я получил что-то странное:
Сначала я предполагаю, что проблема возникла из аргумента annotation_row
. Я проверяю имена строк двух фреймов данных.
all.equal(rownames(colormat), rownames(ann_row))
# [1] TRUE
Вы видите, что они равны.Однако я выполнил следующий код и работу с тепловой картой.
rownames(colormat) <- rownames(ann_row)
pheatmap(colormat, cluster_rows = F, show_rownames = F,
annotation_row = ann_row, gaps_row = gapRow)
Теоретически этот код "rownames(colormat) <- rownames(ann_row)"
не должен иметь смысла, потому что эти два объекта изначально равны, но почему он делаетфункция pheatmap()
работает?
Редактировать: Из комментария @ steveb мне даже не нужно задавать имена строк с помощью ann_row
.Я просто установил
rownames(colormat) <- rownames(colormat)
, и pheatmap также работает.Эта ситуация все еще нелогична.
Конечный результат: