遍历列表中每个矩阵内的每个单元格。我的循环采用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))
}
}
}
答案 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