Алгоритмы кластеризации с R
Я на самом деле пытаюсь создать тепловую карту. Поэтому мне нужно найти подходящий метод кластеризации.
Вот пример моего фрейма данных:
df1
g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 g11
1 1 1 0 0 3 4 4 0 0 6 0
2 0 0 2 2 0 0 0 0 0 0 8
3 0 0 0 0 0 0 0 2 2 0 0
4 0 0 0 0 0 0 0 2 2 0 0
5 0 0 0 0 0 0 0 0 0 0 0
structure(list(g1 = c(1L, 0L, 0L, 0L, 0L), g2 = c(1L, 0L, 0L,
0L, 0L), g3 = c(0L, 2L, 0L, 0L, 0L), g4 = c(0L, 2L, 0L, 0L, 0L
), g5 = c(3L, 0L, 0L, 0L, 0L), g6 = c(4L, 0L, 0L, 0L, 0L), g7 = c(4L,
0L, 0L, 0L, 0L), g8 = c(0L, 0L, 2L, 2L, 0L), g9 = c(0L, 0L, 2L,
2L, 0L), g10 = c(6L, 0L, 0L, 0L, 0L), g11 = c(0L, 8L, 0L, 0L,
0L)), class = "data.frame", row.names = c(NA, -5L))
Тепловая карта такова, что я не хочу перемещать строки, вот настройки, которые я использовал с функцией Heatmap:
ht1 = Heatmap(df1, cluster_rows=as.dendrogram(a),
column_title = "Heatmap",
top_annotation = ha_column2,col=c("white","blue","red","green","yellow"),
column_names_side = NULL,
show_heatmap_legend = FALSE,show_column_names = F,
clustering_distance_columns ="euclidean",
clustering_method_rows = "war.D2",
row_names_gp = gpar(fontsize = 6))
и вот результат:
соответствующая матрица с кластеризацией:
g11 g1 g2 g3 g4 g8 g9 g5 g10 g6 g7
0 1 1 0 0 0 0 3 6 4 4
8 0 0 2 2 0 0 0 0 0 0
0 0 0 0 0 2 2 0 0 0 0
0 0 0 0 0 2 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
Но проблема здесь, я ищу метод кластеризации, который учитывает расположение числа в столбцах. Например, если у меня есть:
A B C D E
0 2 9 0 4
1 0 0 8 0
0 0 0 0 0
0 0 0 0 0
Я хотел бы собрать A и D вместе, потому что они оба располагают:
0
number
0
0
и собрать B, E и C вместе, потому что у них есть расположение:
number
0
0
0
и получить:
A D B E C
0 0 2 4 9
1 8 0 0 0
0 0 0 0 0
0 0 0 0 0
если я применяю это правило к первому массиву, я должен получить это:
g1 g2 g5 g6 g7 g10 g3 g4 g11 g8 g9
1 1 1 3 4 4 6 0 0 0 0 0
2 0 0 0 0 0 0 2 2 8 0 0
3 0 0 0 0 0 0 0 0 0 2 2
4 0 0 0 0 0 0 0 0 0 2 2
5 0 0 0 0 0 0 0 0 0 0 0
У кого-нибудь есть хорошая идея алгоритма кластеризации, чтобы сделать это с R? Спасибо за ваше время.
1 ответ
Вот подход с использованием dplyr
а также tidyr
от tidyverse
мета-пакет. Я подозреваю, что есть более простой способ сделать это в базе R...
Сначала я определяю порядок столбцов, используя только "расположение", делая версию df1
который объединяет все строки в каждом столбце и обрабатывает все ненулевые значения как 1. Сортировав это, мы получаем порядок, который хотим. Тогда я хватаю df1
с колонками в таком порядке.
library(tidyverse)
col_order <- data_frame(cols = names(df1),
concat = apply(df1, 2, paste0, collapse = "")) %>%
mutate(concat_binary = concat %>% str_replace_all("[123456789]", "1")) %>%
arrange(desc(concat_binary)) %>%
pull(cols)
df1 %>%
select(col_order)
# g1 g2 g5 g6 g7 g10 g3 g4 g11 g8 g9
#1 1 1 3 4 4 6 0 0 0 0 0
#2 0 0 0 0 0 0 2 2 8 0 0
#3 0 0 0 0 0 0 0 0 0 2 2
#4 0 0 0 0 0 0 0 0 0 2 2
#5 0 0 0 0 0 0 0 0 0 0 0