按列总和对列进行排序,相邻的相同列
Sort columns by column sums, identical columns adjacent
我有一个由二分值组成的数据集。这是一个非常大的数据集,但这里有一个例子:
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))]
但列不按相似性聚类。也许有一种基于相似性的聚类方法,以列总和为条件。
这是一个有点奇怪的解决方案。您可以通过列的折叠字符串表示形式进行二次排序,这将作为具有等于 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
这不是聚类(无监督结构发现)问题,而只是具有非平凡排序逻辑的排序问题。
根据您的工具提供的功能,您可以
- 按字典顺序排序,然后按总和稳定排序
- 不同则按总和排序,总和相同则按字典序排序
我有一个由二分值组成的数据集。这是一个非常大的数据集,但这里有一个例子:
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))]
但列不按相似性聚类。也许有一种基于相似性的聚类方法,以列总和为条件。
这是一个有点奇怪的解决方案。您可以通过列的折叠字符串表示形式进行二次排序,这将作为具有等于 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
这不是聚类(无监督结构发现)问题,而只是具有非平凡排序逻辑的排序问题。
根据您的工具提供的功能,您可以
- 按字典顺序排序,然后按总和稳定排序
- 不同则按总和排序,总和相同则按字典序排序