问候,
我的目标是创建马尔可夫转换矩阵(从一种状态移动到另一种状态的概率),矩阵的“最高流量”部分占据左上部分。请考虑以下示例:
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 ...
非常感谢, 亚伦
答案 0 :(得分:3)
再次使用rowSums
和colSums
!
第一个问题可以简单地完成:
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