使用R的聚类算法

问题描述 投票:0回答:1

我其实是想创建一个热图。所以我需要找到一个合适的聚类方法。

以下是我的数据框示例:

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的聚类算法有好的想法呢?谢谢你的时间。

r heatmap hierarchical-clustering
1个回答
0
投票

这是使用来自dplyr元数据包的q​​azxswpoi和tidyr的方法。我怀疑在基地R中有一种更简单的方法可以做到这一点......

首先,我只使用“disposition”确定列顺序,方法是创建一个tidyverse版本,该版本连接每列中的所有行,并将所有非零值视为1。通过排序,我们得到了我们想要的订单。然后我按顺序抓住df1列。

df1
© www.soinside.com 2019 - 2024. All rights reserved.