如何在R中按顺序进行聚类并返回聚类大小?

如何在R中按顺序进行聚类并返回聚类大小?,r,R,我对很多R软件包都很不熟悉,所以如果这个问题在别处得到解决,我为自己糟糕的谷歌搜索技能道歉 我试图根据字符序列的汉明距离对其进行分组,并返回组大小。汉明距离定义为将seqA更改为SeqB所需的字符差数。例如,我有以下序列: [1] "24 sequences with ID 64" [1] " AAAAAACAAAGAACC 64" " AAAAAAAAAAACTAT 64" [3] " AAAAATGCGTGTATA 64" " AAAAAACAAAGAACC 64" [5]

我对很多R软件包都很不熟悉,所以如果这个问题在别处得到解决,我为自己糟糕的谷歌搜索技能道歉

我试图根据字符序列的汉明距离对其进行分组,并返回组大小。汉明距离定义为将seqA更改为SeqB所需的字符差数。例如,我有以下序列:

[1] "24 sequences with ID 64"
[1] "   AAAAAACAAAGAACC 64" "   AAAAAAAAAAACTAT 64"
[3] "   AAAAATGCGTGTATA 64" "   AAAAAACAAAGAACC 64"
[5] "   AAAAAAAAAAACTAT 64" "   AAAAATGCGTGTATA 64"
[7] "   AAAAAACAAAGAACC 64" "   AAAAAAAAAAACTAT 64"
[9] "   AAAAATGCGTGTATA 64" "   AAAAAACAAAGAACC 64"
[11] "   AAAAAAAAAAACTAT 64" "   AAAAATGCGTGTATA 64"
[13] "   AAAAAACAAAGAACC 64" "   AAAAAAAAAAACTAT 64"
[15] "   AAAAATGCGTGTATA 64" "   AAAAAACAAAGAACC 64"
[17] "   AAAAAAAAAAACTAT 64" "   AAAAATGCGTGTATA 64"
[19] "   AAAAAACAAAGAACC 64" "   AAAAAAAAAAACTAT 64"
[21] "   AAAAATGCGTGTATA 64" "   AAAAAACAAAGAACC 64"
[23] "   AAAAAAAAAAACTAT 64" "   AAAAATGCGTGTATA 64"
我知道这里有三组独特的序列,它们的汉明距离是:

      [,1] [,2] [,3]
[1,]    0    6    8
[2,]    6    0   10
[3,]    8   10    0

假定所有三个序列在距离上相差超过2(对于A序列看起来像序列B需要改变的位置),我会考虑保留三个唯一的序列集。 如果我有一组序列,它们的汉明距离是这样的:

     [,1] [,2] [,3]
[1,]    0    2   13
[2,]    2    0   13
[3,]   13   13    0

我想说的是,第1组和第2组实际上与他们遇到的相同,我不确定我是否得到了你想要的一切,但这里有一个脚本可以帮助你

我制作了一个脚本来构建组并输出一个列表。这不是非常漂亮,对于一个R初学者来说可能很难理解,但这是我发现的更简单的方法:

make.groupe <- function(the_mat, min_dist = 2) {

  # prepare the result list
  res <- NULL

  # 1 member group:
  res <- as.list(rownames(the_mat)[apply(the_mat,1, function(xx) all(xx>min_dist | xx==0, na.rm=T) )])

  # 2 members group:
  the_mat[upper.tri(the_mat, diag = F)] <- NA

  library(reshape2)
  group <- subset(melt(the_mat), value!=0)
  group <- group[group$value <= min_dist,1:2]

  res <- unname(append(res, lapply(apply(unname(as.matrix(group)),1,as.list),unlist)))

  res
}
其中h是最小距离。这将生成一个向量,其中相似的索引表示相同的组:

cutree(hclust(as.dist(mat1)), h=2)
g1 g2 g3 
 1  1  2 
cutree(hclust(as.dist(mat3)), h=2)
g1 g2 g3 g4 
 1  1  2  2 
cutree(hclust(as.dist(mat2)), h=2)
g1 g2 g3 
 1  2  3 

由于普通人不知道什么是汉明距离,您应该明确代码需要做什么,并使用dput给出示例,或者等待您所在领域的人员帮助您添加简短的定义。我会在通勤后增加更多。我已经更新了我的答案,如果没有回答你的问题,考虑澄清它。非常感谢你的所有信息。当我回到代码的这个区域时,我会看到你的答案带我去哪里。
mat1 <- matrix(c(0,2,13,2,0,13,13,13,0),3,3, dimnames = list(c("g1","g2","g3"),c("g1","g2","g3")))
make.groupe(mat1, 2)
[[1]]
[1] "g3"

[[2]]
[1] "g2" "g1"
mat2 <- matrix(c(0,6,8,6,0,8,8,10,0),3,3, dimnames = list(c("g1","g2","g3"),c("g1","g2","g3")))
make.groupe(mat2, 2)
[[1]]
[1] "g1"

[[2]]
[1] "g2"

[[3]]
[1] "g3"
mat2 <- matrix(c(0,6,8,6,0,8,8,10,0),3,3, dimnames = list(c("g1","g2","g3"),c("g1","g2","g3")))
make.groupe(mat2, 6)
[[1]]
[1] "g3"

[[2]]
[1] "g2" "g1"
mat3 <- matrix(c(0,2,8,9,2,0,7,8,8,7,0,1,9,8,1,0),4,4, dimnames = list(c("g1","g2","g3","g4"),c("g1","g2","g3","g4")))
make.groupe(mat3, 2)
[[1]]
[1] "g2" "g1"

[[2]]
[1] "g4" "g3"
cutree(hclust(as.dist(mat1)), h=2)
cutree(hclust(as.dist(mat1)), h=2)
g1 g2 g3 
 1  1  2 
cutree(hclust(as.dist(mat3)), h=2)
g1 g2 g3 g4 
 1  1  2  2 
cutree(hclust(as.dist(mat2)), h=2)
g1 g2 g3 
 1  2  3