【问题标题】:Sort columns by column sums, identical columns adjacent按列总和对列进行排序,相邻的相同列
【发布时间】:2016-11-15 06:00:56
【问题描述】:

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

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))]

但列不按相似性聚类。也许有一种基于相似度的聚类方法,以列总和为条件。

【问题讨论】:

    标签: r sorting sum col


    【解决方案1】:

    这里有一个奇怪的解决方案。您可以按列的折叠字符串表示进行第二次排序,这将作为具有相等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
    

    【讨论】:

    • 非常感谢!这非常有效。为什么应用设置中有“2L”,而不仅仅是“2”?还有,粘贴和折叠有什么作用?
    • 听起来collapse 正在作为二级排序程序工作。 collapse = ' ' 究竟是什么意思?
    • @jj987246 看看apply() documentation。可变参数... 被传递给FUN(),这在我的解决方案中意味着collapse='' 参数将被传递给paste()。转到paste() documentation,我们看到它需要一个collapse 参数,如果指定,该参数用于使用collapse 字符串作为分隔符将最终向量的所有元素折叠成一个元素。
    【解决方案2】:

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

    根据您的工具提供的功能,您可以

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

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2013-08-07
      • 2012-10-20
      • 2016-08-01
      • 1970-01-01
      • 2016-08-18
      • 2019-08-18
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多