Алгоритмы кластеризации с R - PullRequest
0 голосов
/ 01 марта 2019

Я на самом деле пытаюсь создать тепловую карту.Поэтому мне нужно найти подходящий метод кластеризации.

Вот пример моего фрейма данных:

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))

и вот результат:

picture1

соответствующая матрица с выполненной кластеризацией:

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 Ответ

0 голосов
/ 01 марта 2019

Вот подход, использующий 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...