我想基于列“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
感谢您的帮助!
答案 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