我有一个维度相同的矩阵列表。 在所有矩阵中,大多数值为零。
那些非零值根据矩阵在列表中的位置而变化,替换值存储在与矩阵列表长度相同的向量中。
因此我所做的是使用 for 循环替换非零值。 然而,作为 R 的新手,我开始明白这可能不是最有效的方法,特别是因为我有很多矩阵和相当多的非零概率(所有这些实际上都在某个函数中).
背景是一个本土马尔可夫模型,现在我想完全控制正在发生的事情(即不使用任何包),矩阵实际上是年龄和状态相关的转换矩阵。
所以问题是:有没有办法替换 for 循环,例如通过申请? 我已经尝试了几个小时并在论坛上进行了搜索,但似乎找不到针对这种特定情况的解决方案。 感谢您的帮助!
最小工作示例:
# some large matrix
m0 <- list(as.matrix(cbind(matrix(rep(0,3600), nrow=60))))
# replicate to get a list of 10 matrices of identical dimension
m <- rep(m0, 10)
# some fake data for replacement
set.seed(123)
p1 <- abs(rnorm(length(m), 0.1, 0.4))
p2 <- abs(rnorm(length(m), 0.2, 0.3))
p3 <- abs(rnorm(length(m), 0.3, 0.2))
p4 <- abs(rnorm(length(m), 0.4, 0.1))
# some replacements as example
# works with for loops, but is there a more efficient way to replace, e.g., by apply fcts?
for (i in 1:length(m)) {m[[i]][1,1] <- p1[i]}
for (i in 1:length(m)) {m[[i]][2,4] <- p2[i]}
for (i in 1:length(m)) {m[[i]][20,55] <- p3[i]}
for (i in 1:length(m)) {m[[i]][21,55] <- p4[i]}
最佳答案
或者您可以使用 [<-
在 Map
:
m2 <- rep(m0, 10)
m2 <- Map(`[<-`, m2, list(cbind(1, 1)), p1)
m2 <- Map(`[<-`, m2, list(cbind(2, 4)), p2)
m2 <- Map(`[<-`, m2, list(cbind(20, 55)), p3)
m2 <- Map(`[<-`, m2, list(cbind(21, 55)), p4)
identical(m, m2)
#[1] TRUE
或在一个循环中:
m3 <- rep(m0, 10)
m3 <- Map(`[<-`, m3, list(cbind(c(1, 2, 20, 21), c(1, 4, 55, 55))),
asplit(cbind(p1, p2, p3, p4), 1))
identical(m, m3)
#[1] TRUE
关于替换同维矩阵列表中的 for 循环以提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68980490/