按列总和对相列进行排序,相邻列

时间:2016-07-12 20:25:25

标签: r sorting sum col

我有一个由二分值组成的数据集。它是一个非常大的数据集,但这是一个例子:

var1 <- c(1, 0, 1, 1, 0)
var2 <- c(1, 1, 1, 1, 1)
var3 <- c(0, 0, 1, 1, 0)
var4 <- c(0, 0, 1, 1, 0)
var5 <- c(1, 1, 0, 0, 0)
dat <- data.frame(var1,var2,var3,var4,var5)
dat <- as.matrix(dat)

我试图将两个命令合并为一个。首先,我想对列进行聚类,以便将相同的列集中在一起。其次,我希望按列总和对列进行排序。我可以做其中一个,但不能两个。

因此,输出应如下所示:

var2 var1 var5 var3 var4
   1    1    1    0    0
   1    0    1    0    0
   1    1    0    1    1
   1    1    0    1    1
   1    0    0    0    0

最高的列总和不需要位于左侧。

我尝试使用此命令:

 csums <- dat[,order(colSums(dat,na.rm=TRUE))]

但是这些列不是按相似性聚类的。也许有一种基于相似性的聚类方式,以柱总和为条件。

2 个答案:

答案 0 :(得分:5)

这是一个奇怪的解决方案。您可以按列的折叠字符串表示进行二次排序,这将作为具有相等colSums()的列集的决胜局。这将确保将相同的列聚集在一起,因为它们将按字典顺序排列在一起。

dat[,order(decreasing=T,colSums(dat,na.rm=T),apply(dat,2L,paste,collapse=''))];
##      var2 var1 var5 var3 var4
## [1,]    1    1    1    0    0
## [2,]    1    0    1    0    0
## [3,]    1    1    0    1    1
## [4,]    1    1    0    1    1
## [5,]    1    0    0    0    0

答案 1 :(得分:0)

这不是一个聚类(无监督结构发现)问题,而只是一个带有非平凡排序逻辑的排序问题。

根据您的工具提供的内容,您可以

  1. 按字典顺序排序,然后稳定 - 按总和排序
  2. 如果不同则按总和排序,按字典顺序排序,如果相同的总和