过渡矩阵迫使ncol等于nrows

时间:2016-07-27 23:08:09

标签: r matrix

我创建了一个转换矩阵,作为'从群集'(行)'到群集'(列)频率。想想马尔可夫链。

假设我有5个群集,但只有3个群集,那么我得到一个5 * 3的转换矩阵。如何强制它成为一个5 * 5的过渡矩阵?有效地如何显示所有零列?

我正在寻找一个优雅的解决方案,因为这将适用于涉及数百个集群的更大问题。我真的很不熟悉R矩阵,据我所知,我不知道一种优雅的方法来强制列数输入行数,然后在没有匹配的情况下归零,除了使用for循环,我的预感是不是最佳解决方案。

示例代码:

# example data
cluster_before <- c(1,2,3,4,5)
cluster_after <- c(1,2,4,4,1)

# Table output
table(cluster_before,cluster_after)
# ncol does not = nrows. I want to rectify that

# I want output to look like this:
what_I_want <- matrix(
  c(1,0,0,0,0,
    0,1,0,0,0,
    0,0,0,1,0,
    0,0,0,1,0,
    1,0,0,0,0),
  byrow=TRUE,ncol=5
)

# Possible solution. But for loop can't be best solution?
empty_mat <- matrix(0,ncol=5,nrow=5)

matrix_to_update <- empty_mat

for (i in 1:length(cluster_before)) {
val_before <- cluster_before[i]
val_after <- cluster_after[i]
matrix_to_update[val_before,val_after] <- matrix_to_update[val_before,val_after]+1
}
matrix_to_update
# What's the more elegant solution?

提前感谢您的帮助。非常感谢。

2 个答案:

答案 0 :(得分:3)

让他们factor然后table

levs <- union(cluster_before, cluster_after)
table(factor(cluster_before,levs), factor(cluster_after,levs))

#    1 2 3 4 5
#  1 1 0 0 0 0
#  2 0 1 0 0 0
#  3 0 0 0 1 0
#  4 0 0 0 1 0
#  5 1 0 0 0 0

答案 1 :(得分:1)

另一种解决方案是使用矩阵指示:

what_I_want <- matrix(0,ncol=5,nrow=5)
what_I_want[cbind(cluster_before,cluster_after)] <- 1
print(what_I_want)
##     [,1] [,2] [,3] [,4] [,5]
##[1,]    1    0    0    0    0
##[2,]    0    1    0    0    0
##[3,]    0    0    0    1    0
##[4,]    0    0    0    1    0
##[5,]    1    0    0    0    0

第二行将与行(cluster_before)和列(cluster_after)索引对应的元素设置为1

希望这有帮助。