在R中对具有可变列数的矩阵进行排序

时间:2014-03-01 16:24:42

标签: r sorting matrix

我想基于列“summ”按升序对矩阵MM进行排序,然后按“summ”之前的列1到列的降序排序。因此,如果n = 4,那么我需要根据列“summ”按升序排序MM,然后按列降序排列直到第4列。我的代码是:

n <- 4
M <- matrix(NA_integer_, nrow=2^n-1, ncol=n)
M <- as.matrix(M)
for (i in 1:(2^n-1))
   M[i, ] <- as.integer(intToBits(i)[1:n])
MM <- data.frame(M[-1,])
MM <- cbind(M,apply(M, 1, sum))
dimnames(MM)[[2]] <- c(paste("item",1:n,sep=""), "summ")

我的结果是想跟随代码,而我想要n的一般解决方案。

MMM <- MM[order(MM[,n+1],-MM[,1],-MM[,2],-MM[,3],-MM[,4]),]
      item1 item2 item3 item4 summ
 [1,]     1     0     0     0    1
 [2,]     0     1     0     0    1
 [3,]     0     0     1     0    1
 [4,]     0     0     0     1    1
 [5,]     1     1     0     0    2
 [6,]     1     0     1     0    2
 [7,]     1     0     0     1    2
 [8,]     0     1     1     0    2
 [9,]     0     1     0     1    2
[10,]     0     0     1     1    2
[11,]     1     1     1     0    3
[12,]     1     1     0     1    3
[13,]     1     0     1     1    3
[14,]     0     1     1     1    3
[15,]     1     1     1     1    4

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可以尝试按照以下方式使用自定义功能:

CustomOrder <- function(inTable) {
  n <- ncol(inTable)
  Order <- do.call(order, c(data.frame(inTable[, n], inTable[, 1:(n-1)] * -1)))
  inTable[Order, ]
}

我建议在那里添加一些错误检查,并测试它不仅仅是你在这里提供的样本。

用法是:

CustomOrder(MM)
#       item1 item2 item3 item4 summ
#  [1,]     1     0     0     0    1
#  [2,]     0     1     0     0    1
#  [3,]     0     0     1     0    1
#  [4,]     0     0     0     1    1
#  [5,]     1     1     0     0    2
#  [6,]     1     0     1     0    2
#  [7,]     1     0     0     1    2
#  [8,]     0     1     1     0    2
#  [9,]     0     1     0     1    2
# [10,]     0     0     1     1    2
# [11,]     1     1     1     0    3
# [12,]     1     1     0     1    3
# [13,]     1     0     1     1    3
# [14,]     0     1     1     1    3
# [15,]     1     1     1     1    4