首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集群合并

集群合并
EN

Stack Overflow用户
提问于 2017-12-13 00:21:39
回答 1查看 741关注 0票数 1

我有一个矩阵,用来描述成群的物体。

代码语言:javascript
复制
n <- 6 # number of objects
group <- matrix(c(1,2,1,4,1,3,6,3,5,3,NA,NA,2,NA,2,NA,NA,6,NA,6,NA,NA,NA,NA,4,NA,NA,NA,NA,5),5,6)
colnames(group) <- colnames(group, do.NULL = FALSE, prefix = "obj.")
rownames(group) <- rownames(group, do.NULL = FALSE, prefix = "step.")
group #  an n-1 by n matrix
#        obj.1 obj.2 obj.3 obj.4 obj.5 obj.6
# step.1     1     3    NA    NA    NA    NA
# step.2     2     6    NA    NA    NA    NA
# step.3     1     3     2     6    NA    NA
# step.4     4     5    NA    NA    NA    NA
# step.5     1     3     2     6     4     5

我想要创建一个矩阵与合并集群的步调。此矩阵等于在hclust函数中返回的对象合并。

代码语言:javascript
复制
merge <- matrix(c(-1, -2, 1, -4, 3, -3, -6, 2, -5, 4), 5, 2)
merge
#      [,1] [,2]
# [1,]   -1   -3
# [2,]   -2   -6
# [3,]    1    2
# [4,]   -4   -5
# [5,]    3    4

合并是一个n-1×2矩阵.合并的第一行描述集群在集群的第一步的合并。如果行中的元素j为负值,则在此阶段合并了观察-j。如果j为正,则合并与在算法的(早期)阶段j形成的集群合并。因此,合并中的负条目表示单个个体的聚集,而正项表示非单个个体的聚集。

我一直未能找到一个简单的解决办法。这有什么功能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 01:14:42

基本上你有一组组(每一行一组).

代码语言:javascript
复制
group
#        obj.1 obj.2 obj.3 obj.4 obj.5 obj.6
# step.1     1     3    NA    NA    NA    NA
# step.2     2     6    NA    NA    NA    NA
# step.3     1     3     2     6    NA    NA
# step.4     4     5    NA    NA    NA    NA
# step.5     1     3     2     6     4     5

..。并且您希望知道前两行被合并以形成当前行。

首先,我将创建一个矩阵,该矩阵指示每个对象是否位于特定行:

代码语言:javascript
复制
(hasObs <- sapply(seq_len(ncol(group)), function(i) rowSums(!is.na(group) & group == i)))
#        [,1] [,2] [,3] [,4] [,5] [,6]
# step.1    1    0    1    0    0    0
# step.2    0    1    0    0    0    1
# step.3    1    1    1    0    0    1
# step.4    0    0    0    1    1    0
# step.5    1    1    1    1    1    1

我将使用它创建一个矩阵,其中每个元素(i,j)指示最近出现j的前一行(如果没有前面的行,则表示-j ):

代码语言:javascript
复制
(prevObs <- sapply(seq_len(ncol(hasObs)), function(i) {
  pos <- which(head(hasObs, -1)[,i] == 1)
  rep(c(-i, pos), diff(c(0, pos, nrow(hasObs))))
}))
#        [,1] [,2] [,3] [,4] [,5] [,6]
#          -1   -2   -3   -4   -5   -6
# step.1    1   -2    1   -4   -5   -6
# step.1    1    2    1   -4   -5    2
# step.3    3    3    3   -4   -5    3
# step.3    3    3    3    4    4    3

现在很容易确定哪些行被合并以生成当前行:

代码语言:javascript
复制
t(apply(hasObs*prevObs, 1, function(x) unique(x[x != 0])))
#        [,1] [,2]
# step.1   -1   -3
# step.2   -2   -6
# step.3    1    2
# step.4   -4   -5
# step.5    3    4

第一行组合单个元素1和3,第二行组合单个元素2和6,第三行组合前两个组,第四组合单个元素4和5,第五行组合来自第3行和第4行的组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47783697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档