【问题标题】:R: Attach result matrix to all lists in environmentR:将结果矩阵附加到环境中的所有列表
【发布时间】:2017-09-21 15:45:02
【问题描述】:

(我会先在聊天中问,但是我的业力还不够。)

我有包含矩阵的列表,比如说:

List1 <- list(ch1 = matrix(1:4, ncol = 2), ch2 = matrix(5:8, ncol = 2))
List2 <- list(ch1 = matrix(2:5, ncol = 2), ch2 = matrix(6:9, ncol = 2))

我现在想对我环境中的所有列表执行计算,并将结果作为另一个矩阵附加到相应的列表中。假设 ch3 应该是 ch1 + ch2,所以 List1 看起来像:

$ch1
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$ch2
     [,1] [,2]
[1,]    5    7
[2,]    6    8

$ch3
     [,1] [,2]
[1,]    6   10
[2,]    8   12

由于列表的长度不同,我必须按名称、ch1 等来处理矩阵。

我的方法得到了正确的结果,但不是作为矩阵附加,而是作为整数附加。解决这个问题很麻烦,所以肯定有更好的方法。

LST <- objects(pattern = "List+(\\d+)", envir = globalenv())

for (i in 1:length(LST)){
  pointer1 <- which(names(get(LST[[i]])) == "ch1")
  pointer2 <- which(names(get(LST[[i]])) == "ch2")

  matrix1 <- get(LST[[i]])[pointer1][[1]]
  matrix2 <- get(LST[[i]])[pointer2][[1]]

  result <- matrix1 + matrix2
  # print(dim(result))# results in 2 2, as expected

  assign(LST[[i]], c(get(LST[[i]]), matrix(result, ncol = ncol(matrix1))))

  # rm(pointer1, pointer2, matrix1, matrix2, result)
}

作为我的每个大约。 100 个列表由超过 15 个矩阵组成,每个矩阵最多 300MB,由于内存限制,我无法将它们合并到一个数组中。理想情况下,我最终会拥有一个函数或类似 lapply 的简洁的东西,但是,我不能让任何一个都正常工作。

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    我已经解决了。不得不在比预期更多的步骤中编码,由于某种原因它只能这样工作。考虑以下几点:

    List1 <- list(ch1 = matrix(1:4, ncol = 2), ch2 = matrix(5:8, ncol = 2))
    List2 <- list(ch1 = matrix(2:5, ncol = 2), ch2 = matrix(6:9, ncol = 2))
    
    LST <- objects(pattern = "List+(\\d+)", envir = globalenv())
    
    for (i in 1:length(LST)){
      pointer1 <- which(names(get(LST[[i]])) == "ch1")
      pointer2 <- which(names(get(LST[[i]])) == "ch2")
    
      matrix1 <- get(LST[[i]])[pointer1][[1]]
      matrix2 <- get(LST[[i]])[pointer2][[1]]
    
      result <- matrix1 + matrix2
    
      tmpList <- get(LST[[i]])
    
      ListLength <- length(tmpList)
      chNames <- names(tmpList)
      chNames <- c(chNames, "ch3")
    
      tmpList[[ListLength + 1]] <- result
    
      names(tmpList) <- chNames
    
      assign(LST[[i]], tmpList)
    }
    rm(i, ListLength, LST, pointer1, pointer2, matrix1, matrix2, result, chNames, tmpList)
    

    产生期望的结果:

    > List1
    $ch1
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    
    $ch2
         [,1] [,2]
    [1,]    5    7
    [2,]    6    8
    
    $ch3
         [,1] [,2]
    [1,]    6   10
    [2,]    8   12
    
    > List2
    $ch1
         [,1] [,2]
    [1,]    2    4
    [2,]    3    5
    
    $ch2
         [,1] [,2]
    [1,]    6    8
    [2,]    7    9
    
    $ch3
         [,1] [,2]
    [1,]    8   12
    [2,]   10   14
    

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2014-10-24
      • 2021-07-29
      • 1970-01-01
      • 2017-03-28
      • 2021-02-21
      相关资源
      最近更新 更多