R循环遍历多个矩阵

时间:2014-08-09 13:39:27

标签: r loops matrix

我有472个矩阵,每个矩阵有405列(matrix1,...,matrix400),并希望有472个新矩阵,只有该矩阵的前244列。我怎样才能做到这一点?我试过了:

for (i in 1:472) {
assign(paste("new_matrix",i,sep=""), matrix[[i]][,c(1:244)])
}

我通过将一个数据帧拆分一个标识符(对于组)来创建矩阵:

for (i in 1:472){
   assign(paste("matrix", i, sep=""), subset(data, ID==i))
}

不知怎的,我无法对每个矩阵说话,但我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:3)

你显然应采取不同的方法。分配所有个人 matricies NOT 是一种很好的方法。但这是你可以做到的一种方式......

mat1 <- matrix(1:6, 2, 3)
mat2 <- matrix(2:7, 2, 3)

example_func <- function(mati) {

  mat_name <- as.name(paste0("mat", mati))
  bquote(.(mat_name) <- .(mat_name)[ , 1:2])

}

for (i in 1:2) eval(example_func(i))

但是,使用eval会很复杂,因为您必须非常小心环境,尤其是在函数中使用时。例如,尝试运行lapply(1:2, function(x) eval(example_func(x)))而不是使用for-loop并查看结果的不同。

要采取更好的方法,请查看?split

some_data <- data.frame(ID = rep(1:4, each = 4),
                        V1 = 1:16,
                        v2 = letters[1:16])

split(some_data, list(some_data$ID))

然后,您可以使用lapply来迭代您的子集和子集。或者,更好的是,只需将原始data.frame下放到您想要的列,然后使用split

答案 1 :(得分:1)

matrix1 <- matrix(1:25, 5,5)
matrix2 <- matrix(26:50, 5,5)

假设,我想要对上述矩阵的前3列进行子集化,

list2env(
   setNames(
          lapply(mget(ls(pattern="matrix")), `[`, ,1:3),
                  paste("new", ls(pattern="matrix"),sep="_")), 
                                               envir=.GlobalEnv)

  new_matrix1
  #     [,1] [,2] [,3]
  #[1,]    1    6   11
  #[2,]    2    7   12
  #[3,]    3    8   13
  #[4,]    4    9   14
  #[5,]    5   10   15

  new_matrix2
  #      [,1] [,2] [,3]
  # [1,]   26   31   36
  # [2,]   27   32   37
  # [3,]   28   33   38
  # [4,]   29   34   39
  # [5,]   30   35   40
  • ls(pattern="matrix")将输出[1] "matrix1" "matrix2"
  • mget以列表形式获取存储在上述矩阵中的值
  • 使用lapply(..., [,1:3)
  • 对列表中的前3列矩阵进行子集
  • 使用matrix1matrix2
  • 更改setNamespaste列表元素的名称
  • 使用list2env创建新对象new_matrix1new_matrix2。但是,在您的情况下,这将在全局环境中创建472 new_matrices。我更愿意在列表中对矩阵进行子集化,在列表中进行所有必要的计算。然后,您可以使用write.table中的write.matrixlibrary(MASS)将列表元素写入文件。

答案 2 :(得分:0)

如果您从数据框开始

以下是如何以群组分割的矩阵列表(以及其名称)和您想要的行数结束:

library("ddply")
dlply(iris, .(Species), function(x) x[1:10,])

iris是一个基数为R的虚拟数据帧; 物种是你的因素组