根据rowSums + short'apply'Q在矩阵上排列元素

时间:2010-12-02 08:49:59

标签: r

问候,

我的目标是创建马尔可夫转换矩阵(从一种状态移动到另一种状态的概率),矩阵的“最高流量”部分占据左上部分。请考虑以下示例:

inputData <- c(
    c(5, 3, 1, 6, 7),
    c(9, 7, 3, 10, 11),
    c(1, 2, 3, 4, 5),
    c(2, 4, 6, 8, 10),
    c(9, 5, 2, 1, 1)
    )

MAT <- matrix(inputData, nrow = 5, ncol = 5, byrow = TRUE)
colnames(MAT) <- c("A", "B", "C", "D", "E")
rownames(MAT) <- c("A", "B", "C", "D", "E")

rowSums(MAT)

我想重新排列这个矩阵的元素,使得具有最大行和的元素按降序排列在左上角。这有意义吗?在这种情况下,我正在寻找的顺序是B,D,A,E,C任何想法?

顺便说一句,这是我编写的用于构造转换矩阵的函数。是否有更优雅的方式来做这个不涉及双转置?

TMAT <- apply(t(MAT), 2, function(X) X/sum(X))
TMAT <- t(TMAT)

我尝试了以下内容:

TMAT <- apply(MAT, 1, function(X) X/sum(X))

但我的自定义函数仍然应用于数组的列,而不是行。如需检查,请尝试:

rowSums(TMAT)
colSums(TMAT)

此处的行总和应等于1 ...

非常感谢, 亚伦

2 个答案:

答案 0 :(得分:3)

再次使用rowSumscolSums! 第一个问题可以简单地完成:

MAT[order(rowSums(MAT),decreasing=T),]

第二个:

MAT/rep(rowSums(MAT),nrow(MAT))

这有点hacky,但如果你记得矩阵也是一个列列向量,那就很明显了。 考虑到回收也可以通过以下方式完成:

MAT/rowSums(MAT)

答案 1 :(得分:1)

对于您的第一个请求,这将按行总数进行所需的降序重新排序:

MAT[rev(order(rowSums(MAT))), ]

这样就可以让您的TMAT一步到位。 apply函数返回一系列向量,矩阵的列主要排序将转换R期望用户的结果。

> TMAT <- t(apply(MAT, 1, function(X) X/sum(X)) )
> rowSums(TMAT)
A B C D E 
1 1 1 1 1