R编程:如何在连续标记的变量上使用循环?

时间:2016-04-17 20:16:18

标签: r list loops matrix

我试图找出,如何在一些具有连续标签的变量上运行循环。

我想做matrix.2-Matrix.1并将其存储在矩阵x.1中,然后存储在Matrix.3-matrix.2中并将其存储在矩阵x.2中。有300个矩阵(Matrix.1,Matrix.2,... Matrix.300)但是对于这个例子,我想在矩阵1,2和3上工作。

我首先尝试了一种涉及列表功能的方法,但它没有用,然后我考虑使用MACRO就像在SAS(%符号)中一样。但宏观方法似乎不适用于R。

我的代码如下: (列表方法)

> Matrix.1=matrix(c(1:6),nrow=2,ncol=3,byrow=TRUE)
> Matrix.2=matrix(c(1,8,9,17,15,2),nrow=2,ncol=3,byrow=TRUE)
> Matrix.3=matrix(c(0,1,2,3,6,0),nrow=2,ncol=3,byrow=TRUE)
> x.1=matrix(rep(0,6),nrow=2,ncol=3,byrow=TRUE)
> x.2=matrix(rep(0,6),nrow=2,ncol=3,byrow=TRUE)
> m=list(Matrix.1=Matrix.1,Matrix.2=Matrix.2,Matrix.3=Matrix.3)
> x=list(x.1=x.1,x.2=x.2)
> m[1]
$Matrix.1
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> m[2]
$Matrix.2
     [,1] [,2] [,3]
[1,]    1    8    9
[2,]   17   15    2
> m[3]
$Matrix.3
     [,1] [,2] [,3]
[1,]    0    1    2
[2,]    3    6    0
> x[1]
$x.1
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

> x[2]
$x.2
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

> for (i in 1:2){
+ x[i]=m[i+1]-m[i]
+ print(x[i])
+ }
Error in m[i + 1] - m[i] : non-numeric argument to binary operator
> 

如何在列表上进行操作?

> #Other approach inspired from SAS
> for (i in i:2){
+ x.i=Matrix.i+1-Matrix.i
+ print(R.i)
+ }
Error: object 'Matrix.i' not found

第二种方法在R中甚至无法实现。

处理涉及连续标记变量的循环的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

由于mx都是列表,因此您需要使用m[[1]]x[[1]]来提取其元素。

for (i in 1:2){
  x[[i]] <- m[[i+1]]-m[[i]]
  print(x[[i]])
}

另一方面,如果您有300个矩阵(Matrix.1,Matrix.2,... Matrix.300),您可以使用getassign来处理数字标签。在这里,我首先将值分配给名称为Matrix.1Matrix.300的300个矩阵。然后我使用get函数提取这些矩阵并生成列表x

for (i in 1:300) {
  assign(paste("Matrix.", i, sep = ""), matrix(rnorm(9), 3, 3))
}

x <- list()
for (i in 2:300) {
  x[[i-1]] <- get(paste("Matrix.", i, sep = "")) - get(paste("Matrix.", i-1, sep = ""))
}

答案 1 :(得分:0)

使用apply系列函数循环遍历对象是R中的首选方法。对于列表,您可以使用lapply返回列表,或sapply返回最简化的对象,而不会丢失任何信息。使用这些功能,您输出的输出顺序与输入相同,这使得比较或附加步骤更加容易。

myProcessedList <- lapply(x, FUN=<some function>)

这比使用assignget更简单,更直接,值得投资学习。 SO有许多有用的例子。