Как добавить матрицы, сгенерированные с помощью манипуляций, в три списка в R? - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время у меня есть три списка List.1, List.2 и List.3, каждый из которых содержит 500 матриц, каждый из которых имеет размеры 100 x 100.Следовательно, List.1[[1]] является матрицей измерений 100 x 100.

Манипуляция, которую я хотел бы сделать, состоит в том, чтобы увидеть, какой из элементов для данной матрицы в List.2 находится между соответствующей матрицей и элементами в List.1 и List.3.Манипуляция - это следующее для одной матрицы в 3 списках:

+(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]])
}

, что, очевидно, не является самымидеальный способ сделать это.Любая мысль будет оценена.Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...