我创建了一个转换矩阵,作为'从群集'(行)'到群集'(列)频率。想想马尔可夫链。
假设我有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?
提前感谢您的帮助。非常感谢。
答案 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
。
希望这有帮助。