遍历列表R中每个矩阵的值

时间:2019-09-13 07:31:49

标签: r loops matrix

遍历列表中每个矩阵内的每个单元格。我的循环采用nxn矩阵,并输出原始矩阵中每个非NA值的坐标的nx2矩阵。我已经成功编写了针对一个矩阵实现此目标的代码,如何为列表中的每个矩阵实现此结果。输出是nx2个矩阵的列表。

我获取了列表的一个元素并成功地遍历了整个列表,只是努力地添加我的代码以立即遍历列表

```r
m2=m1[[1]]
##ppp ready matrix

zzz <- NULL

for (i in 1:ncol(m2)){
  for (j in 1:nrow(m2)) {
    if (is.na(m2[i,j]) == FALSE){
    x=i
    y=j
    zzz <- rbind(zzz,c(i,j))

    }
  }
  }

2 个答案:

答案 0 :(得分:1)

您要使代码成为一个函数并在m1列表中使用该函数。

matrixOperations <- function(m2) {
  zzz <- NULL

  for (i in 1:ncol(m2)) {
    for (j in 1:nrow(m2)) {
      if (is.na(m2[i, j]) == FALSE) {
        x <- i
        y <- j
        zzz <- rbind(zzz, c(i, j))
      }
    }
  }

  zzz
}

result <- lapply(m1, FUN = matrixOperations)

答案 1 :(得分:0)

我有一个通过将行和列值分配给矩阵索引(sinkr::matrixIndex)来矢量化这些类型的矩阵运算的功能。

以下示例显示了如何在您的情况下工作:

示例

# make list of matrices (M) (I rows, J columns, K list levels)
I = 2
J = 5
K = 3

set.seed(1)
M <- lapply(split(seq(K), seq(K)), FUN = 
  function(k){matrix(sample(c(NaN,1), I*J, replace = TRUE), nrow = I, ncol = J)}
)


# return indices of non-NA values for each matrix (m) in list M
library(sinkr) # https://github.com/marchtaylor/sinkr

res <- lapply(M, FUN = function(m){
  matrixIndex(idx = which(!is.na(m)), dim.mat = dim(m))
})

# compare results
M[[1]]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]  NaN  NaN    1  NaN    1
# [2,]    1  NaN  NaN  NaN    1

res[[1]]
# > res[[1]]
#      row col
# [1,]   2   1
# [2,]   1   3
# [3,]   1   5
# [4,]   2   5