【问题标题】:Reassign values within a Loop in R在 R 的循环中重新分配值
【发布时间】:2026-01-25 01:55:01
【问题描述】:

我需要将矩阵estado乘以矩阵matriz_de转换并将变量estado重新分配给乘法的结果,我必须这样做1000次,我需要重复模拟100 次。

estado矩阵乘以matriz_de_transicion 1000次,看看estado的值是否收敛,然后重复此操作100次。

我尝试过使用 for 循环,但是我将值重新分配给变量 estado 的方式不起作用,因为我一直得到相同的结果,即使我手动执行它似乎也有效。

This is my code:

    nombre_estados <- c("Estado 1","Estado 2","Estado 3")
    matriz_de_transicion <- matrix(c(0.2,0.7,0.1,
                                     0.3,0.7,0.0,
                                     0.1,0.4,0.5), 
                            byrow = T,nrow = 3, dimnames = list(nombre_estados,nombre_estados))
    estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1)

    estado <- estado %*% matriz_de_transicion
    estado # 0.26     0.67     0.07
    estado <- estado %*% matriz_de_transicion
    estado # 0.26    0.679    0.061
   # repeat this 1000 times

非常感谢您的回答,我怎样才能将这些最终的estados 添加到 100 x 3 矩阵中?我创建了 100 x 3 矩阵:

datos <- matrix(c(0,0,0),byrow = F,ncol =  3, nrow = 100)

然后我尝试做一个嵌套循环:

for(i in 1:100){
for(i in 1:1000){
  estado <- estado %*% matriz_de_transicion  
}
  datos[,1] <- estado[1,1]
  datos[,2] <- estado[1,2]
  datos[,3] <- estado[1,3]
  estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1) # I thought this would reset the value to the initial state but I fill the 100 x 3 matrix with the same values.
}
           [,1]      [,2]       [,3]
  [1,] 0.2631579 0.6842105 0.05263158
  [2,] 0.2631579 0.6842105 0.05263158
  [3,] 0.2631579 0.6842105 0.05263158
  [4,] 0.2631579 0.6842105 0.05263158
  [5,] 0.2631579 0.6842105 0.05263158
  [6,] 0.2631579 0.6842105 0.05263158
  [7,] 0.2631579 0.6842105 0.05263158
  [8,] 0.2631579 0.6842105 0.05263158

我正在努力重置 estado 变量的值,对于我最终需要获得的 100 个模拟中的每一个,因此 1:1000 循环中的每一个对于 @987654333 都有相同的起始值@。

【问题讨论】:

    标签: r loops


    【解决方案1】:

    可能类似于以下内容。

    我有函数返回额外信息,因为你问estado 的值是否收敛。

    fun <- function(M, Trans, n = 1000, tol = .Machine$double.eps^0.5){
        for(i in seq_len(n)){
            Prev <- M
            M <- M %*% Trans
            if(all(abs(M - Prev) < tol)) break
        }
        list(Final = M, converge = i < n, iter = i)
    }
    
    fun(estado, matriz_de_transicion)
    #$`Final`
    #      Estado 1  Estado 2   Estado 3
    #[1,] 0.2631579 0.6842105 0.05263159
    #
    #$converge
    #[1] TRUE
    #
    #$iter
    #[1] 18
    

    【讨论】:

    • 我们的价值观是匹配的。因此,我认为,简单的for-loop 正在努力适应这种情况。
    • @MKR 是的,但假设 OP 必须使用不同的矩阵来执行此操作。那么函数是一种更方便的方法。
    • 绝对是一个更好的方法。但我对 OP 的评论感到有点困惑,即for-loop 的值与re-assign 不同。因此,我想用一个答案来澄清这一点。
    【解决方案2】:

    我确信只有for-loop 就可以满足此目的。不知道为什么 OP 认为计算不会对下一次调用生效。 estado 无论如何都是在全局范围内声明的。

    estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1)
    for(i in 1:1000){
      estado <- estado %*% matriz_de_transicion  
    }
    estado 
    #  Estado 1  Estado 2   Estado 3
    #[1,] 0.2631579 0.6842105 0.05263158
    

    【讨论】:

    • 非常感谢!然后我如何将这些最终的estados 添加到 100 x 3 矩阵中? datos &lt;- matrix(c(0,0,0),byrow = F,ncol = 3, nrow = 100) n = 100 for(i in 1:100){ for(i in 1:1000){ estado &lt;- estado %*% matriz_de_transicion } datos[,1] &lt;- estado[1,1] datos[,2] &lt;- estado[1,2] datos[,3] &lt;- estado[1,3] estado &lt;- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1) } 我正在努力重置 estado 变量的值,对于我最终需要获得的 100 个模拟中的每一个,因此 1:1000 循环中的每一个都具有相同的起始值 @987654327 @.
    最近更新 更多