使用index在R中的循环后命名矩阵

时间:2013-02-15 15:52:14

标签: r matrix

请原谅我天真的问题。

我有一个循环,每个步骤返回一个矩阵b。 我想根据迭代次数以不同的名称保存每个循环中的每个矩阵。例如,在第一次迭代结束时,我想得到名为b1的矩阵,在第二次迭代结束时b2等......

举个例子,让我们使用以下代码:

count=0
a=matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), nrow=6)
for (count in 1:10)  {
  b<-cbind(a[,1],matrix(c( a[sample(nrow(a)),2]), nrow=nrow(a)) ) 
  print(b)
}
count+1

此处,原始矩阵为matrix a,其中包含6行和2列。 我置换了第二列中元素的顺序。生成的matrix b是一个矩阵,其作为第一列包含原始matrix a的第一列,第二列包含a的置换第二列。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

你真的不想将它们存储为单独的变量 - 将它们保存为10个矩阵的列表会好得多。使用replicate

可以非常轻松地完成
lst = replicate(10, cbind(a[,1],matrix(c( a[sample(nrow(a)),2]), nrow=nrow(a)) ),
          simplify=FALSE)

然后您可以访问以下10个矩阵中的任何一个:

lst[[1]]
#     [,1] [,2]
#[1,]    1    7
#[2,]    2   10
#[3,]    3   11
#[4,]    4    8
#[5,]    5    9
#[6,]    6   12

同样,你可以像这样循环它们:

for (m in lst) {
    print(m)
    # do something with your matrix m
}

答案 1 :(得分:1)

如前所述,列表是更好的选择。但是,如果您仍希望将每个交互保存在不同的变量上,则可以使用assign()

count=0
a=matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), nrow=6)
for (count in 1:10)  {
  assign(paste('b',count,sep=''),cbind(a[,1],matrix(c( a[sample(nrow(a)),2]), nrow=nrow(a))))
}
b1
b2

答案 2 :(得分:1)

如在其他选项中所述,最好使用列表。这是一个使用sapply得到漂亮命名结果的版本:

 res <- sapply(paste('b',1:10,sep=''), 
           function(x) cbind(a[,1],matrix(c( a[sample(nrow(a)),2]), nrow=nrow(a)) ),
       simplify=F)

然后以矩阵b5为例,

res$b5

   [,1] [,2]
[1,]    1    9
[2,]    2    7
[3,]    3    8
[4,]    4   11
[5,]    5   10
[6,]    6   12