【问题标题】:Filling a matrix sequentially using for loop in R在R中使用for循环顺序填充矩阵
【发布时间】:2014-02-13 18:48:58
【问题描述】:

这里有一个循环问题,我不能完全正确。

我希望矩阵 (w) 的每一行在时间“d”内重复填充矩阵 (mat)。矩阵(运行)只是这样我可以通过记录通过矩阵(w)运行的值来检查我的循环是否正确运行。


这是我现在的编码:

x<-c(0,0,0,0)
y<-c(0,0,0,0)
z<-c(10,50,100,150)
a<-8
b<-4
d<-5

w<-cbind(x,y,z)

run<-matrix(0, ncol=3, nrow=d, byrow=T)
for(h in 1:d){

  mat<-matrix(0, ncol=3, nrow=a, byrow=T)
  for(j in 1:a){
    for(i in 1:b){
      mat[j,]<- w[i,]
    }
  }
  run[h,]<-mat[1,]
}

我填写矩阵 (mat) 的方式肯定有问题,因为我重复输入相同的值而不是按顺序输入。在这种情况下正确的语法应该是什么?


编辑:抱歉,澄清一下。我想运行我的循环 5 次,并且对于每次运行,创建一个矩阵(mat)(见下文),其中填充了矩阵 (w) 的后续行。

    V1  V2  V3
1   0   0   10
2   0   0   10
3   0   0   10
4   0   0   10
5   0   0   10


    V1  V2  V3
1   0   0   50
2   0   0   50
3   0   0   50
4   0   0   50
5   0   0   50

等等等等……

【问题讨论】:

  • w[rep(1:nrow(w), each = d), ]?

标签: r loops


【解决方案1】:

创建矩阵列表:

lapply(1:nrow(w), function(x) w[rep(x, each = d), ])


# [[1]]
#      x y  z
# [1,] 0 0 10
# [2,] 0 0 10
# [3,] 0 0 10
# [4,] 0 0 10
# [5,] 0 0 10
# 
# ... 
#
# [[4]]
#      x y   z
# [1,] 0 0 150
# [2,] 0 0 150
# [3,] 0 0 150
# [4,] 0 0 150
# [5,] 0 0 150

【讨论】:

  • 我希望能够使用循环来做到这一点,但我认为我必须修改我的想法。对不起另一个问题,但我应该如何将每个输出保存为单独的矩阵? As.matrix 给了我一个列表。
  • 列表是一种更好的保存方式,但如果您想将每个矩阵保存在一个新的变量名下,您可以通过mat[[1]], mat[[2]] 等方式访问它们。
【解决方案2】:

试试:

    mat <-  do.call("rbind", lapply(1:nrow(w), function(x) matrix(rep(w[x,],d), nrow=d, byrow=T)))
      [,1] [,2] [,3]
 [1,]    0    0   10
 [2,]    0    0   10
 [3,]    0    0   10
 [4,]    0    0   10
 [5,]    0    0   10
 [6,]    0    0   50
 [7,]    0    0   50
 [8,]    0    0   50
 [9,]    0    0   50
[10,]    0    0   50
[11,]    0    0  100
[12,]    0    0  100
[13,]    0    0  100
[14,]    0    0  100
[15,]    0    0  100
[16,]    0    0  150
[17,]    0    0  150
[18,]    0    0  150
[19,]    0    0  150
[20,]    0    0  150

【讨论】:

  • 感谢您的回答。它非常接近我所需要的,除了我希望“mat”有 5 行相同的值(w[i,])并为每次运行“d”重新创建。请查看我的示例以获取我的编辑
  • 那么,我的答案中的mat 重复了 5 次?
  • 5 'mat's 每个包含同一行的重复。所以基本上你的“垫子”切成 4 个更小的矩阵。
  • 见下面@Henrik 的回答。
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多