我目前有三个列表List.1
,List.2
和List.3
,每个列表包含500个矩阵,每个矩阵的维度为100 x 100
。因此,List.1[[1]]
是维度100 x 100
的矩阵。
我想要做的操作是查看List.2
中给定矩阵的哪些元素位于相应矩阵与List.1
和List.3
中的元素之间。 3个列表中的一个矩阵的操作is:
+(List.2[[1]] < List.3[[1]] & List.2[[1]] > List.1[[1]])
返回1和0的矩阵,如果满足上述条件则为1,如果不满足则为0。
我想在列表中的所有500个矩阵中执行此操作,而不必求助于循环。有没有办法使用Reduce
或lapply
函数或两者兼有?
到目前为止我所拥有的是:
zero.one.mat <- List.1[[1]]-List.1[[1]] # Create empty zero matrix
for(i in 1:500){
zero.one.mat <- zero.one.mat + +(List.2[[i]] < List.3[[i]] & List.2[[i]] > List.1[[i]])
}
这显然不是最理想的做法。任何想法将不胜感激。谢谢!
答案 0 :(得分:1)
list.1 <- list()
list.2 <- list()
list.3 <- list()
N=5
list.1[[1]] <- matrix(1,nrow=N, ncol=N)
list.2[[1]] <- matrix(2,nrow=N, ncol=N)
list.3[[1]] <- matrix(3,nrow=N, ncol=N)
list.1[[2]] <- matrix(-1,nrow=N, ncol=N)
list.2[[2]] <- matrix(-2,nrow=N, ncol=N)
list.3[[2]] <- matrix(-3,nrow=N, ncol=N)
list.1[[3]] <- matrix(rnorm(N*N),nrow=N, ncol=N)
list.2[[3]] <- matrix(rnorm(N*N),nrow=N, ncol=N)
list.3[[3]] <- matrix(rnorm(N*N),nrow=N, ncol=N)
list.result <- lapply(1:length(list.1), FUN=function(i){list.2[[i]] < list.3[[i]] & list.2[[i]] > list.1[[i]]})
# [[1]]
# [,1] [,2] [,3] [,4] [,5]
# [1,] TRUE TRUE TRUE TRUE TRUE
# [2,] TRUE TRUE TRUE TRUE TRUE
# [3,] TRUE TRUE TRUE TRUE TRUE
# [4,] TRUE TRUE TRUE TRUE TRUE
# [5,] TRUE TRUE TRUE TRUE TRUE
#
# [[2]]
# [,1] [,2] [,3] [,4] [,5]
# [1,] FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE FALSE
#
# [[3]]
# [,1] [,2] [,3] [,4] [,5]
# [1,] FALSE FALSE FALSE TRUE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE TRUE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE TRUE TRUE
# If you need to fund the sum of all of them, then you can add Reduce:
Reduce("+",lapply(1:length(list.1),
FUN=function(i){
list.2[[i]] < list.3[[i]] &
list.2[[i]] > list.1[[i]]}))
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 1 1 2 1
# [2,] 1 1 1 1 1
# [3,] 1 1 1 1 1
# [4,] 1 2 1 1 1
# [5,] 1 1 1 2 2