подмножить матрицу в цикле for с помощью логического оператора или (|)

Я пытаюсь сделать подмножества матрицы. Каждое подмножество зависит от набора логических условий. Например, первое подмножество первого списка (R[[1]][[1]]) соответствует последнему столбцу матрицы, равному 1 или 3 и т. д. Я хотел бы использовать это в цикле.

Это пример данных, которые у меня есть:

l = list(
  list(c(1, 3),c(2, 3)),
  list(c(1,5),c(2,5,6,7),c(3,6,8),c(4,7,8))
)

a1 <- array(1, dim=c(12,10))
a2 <- array(1, dim=c(18,10))
v1 <- c(1,1,3,1,2,3,1,1,3,1,2,2)
v2 <- c(1,1,3,1,5,2,4,5,5,5,7,8,1,4,5,8,2,4)<br/>
m1 <- as.matrix(cbind(a1,v1))
m2 <- as.matrix(cbind(a2,v2))
m <- list(m1,m2)

Это код, который я использую:

R <- rep(list(list()),length(m))
  for(i in 1:length(m)) {
    for(j in 1:length(l[[i]])) {
      R[[i]][[j]] <- m[[i]][m[[i]][,dim(m[[i]])[2]] == l[[i]][[j]],]
}}

Я получаю следующие результаты, которые мне не нужны:

[[1]]
[[1]][[1]]
[1,] 1 1 1 1 1 1 1 1 1 1  1
[2,] 1 1 1 1 1 1 1 1 1 1  3
[3,] 1 1 1 1 1 1 1 1 1 1  1
[[1]][[2]]
[1,] 1 1 1 1 1 1 1 1 1 1  2
[2,] 1 1 1 1 1 1 1 1 1 1  3
[3,] 1 1 1 1 1 1 1 1 1 1  2
[[2]]
[[2]][[1]]
[1,] 1 1 1 1 1 1 1 1 1 1  1
[2,] 1 1 1 1 1 1 1 1 1 1  5
[3,] 1 1 1 1 1 1 1 1 1 1  5
[4,] 1 1 1 1 1 1 1 1 1 1  1
[[2]][[2]]
[1,] 1 1 1 1 1 1 1 1 1 1  5
[2,] 1 1 1 1 1 1 1 1 1 1  2
[[2]][[3]]
 1  1  1  1  1  1  1  1  1  1  8 
[[2]][[4]]
[1,] 1 1 1 1 1 1 1 1 1 1  4
[2,] 1 1 1 1 1 1 1 1 1 1  7
[3,] 1 1 1 1 1 1 1 1 1 1  8

Это результат, который я хотел бы получить вместо этого:

[[1]]
[[1]][[1]]
 [1,] 1 1 1 1 1 1 1 1 1 1  1
 [2,] 1 1 1 1 1 1 1 1 1 1  1
 [3,] 1 1 1 1 1 1 1 1 1 1  3
 [4,] 1 1 1 1 1 1 1 1 1 1  1
 [5,] 1 1 1 1 1 1 1 1 1 1  3
 [6,] 1 1 1 1 1 1 1 1 1 1  1
 [7,] 1 1 1 1 1 1 1 1 1 1  1
 [8,] 1 1 1 1 1 1 1 1 1 1  3
 [9,] 1 1 1 1 1 1 1 1 1 1  1
[[1]][[2]]
[1,] 1 1 1 1 1 1 1 1 1 1  3
[2,] 1 1 1 1 1 1 1 1 1 1  2
[3,] 1 1 1 1 1 1 1 1 1 1  3
[4,] 1 1 1 1 1 1 1 1 1 1  3
[5,] 1 1 1 1 1 1 1 1 1 1  2
[6,] 1 1 1 1 1 1 1 1 1 1  2
[[2]]
[[2]][[1]]
 [1,] 1 1 1 1 1 1 1 1 1 1  1
 [2,] 1 1 1 1 1 1 1 1 1 1  1
 [3,] 1 1 1 1 1 1 1 1 1 1  1
 [4,] 1 1 1 1 1 1 1 1 1 1  5
 [5,] 1 1 1 1 1 1 1 1 1 1  5
 [6,] 1 1 1 1 1 1 1 1 1 1  5
 [7,] 1 1 1 1 1 1 1 1 1 1  5
 [8,] 1 1 1 1 1 1 1 1 1 1  1
 [9,] 1 1 1 1 1 1 1 1 1 1  5
[[2]][[2]]
[1,] 1 1 1 1 1 1 1 1 1 1  5
[2,] 1 1 1 1 1 1 1 1 1 1  2
[3,] 1 1 1 1 1 1 1 1 1 1  5
[4,] 1 1 1 1 1 1 1 1 1 1  5
[5,] 1 1 1 1 1 1 1 1 1 1  5
[6,] 1 1 1 1 1 1 1 1 1 1  7
[7,] 1 1 1 1 1 1 1 1 1 1  5
[8,] 1 1 1 1 1 1 1 1 1 1  2
[[2]][[3]]
[1,] 1 1 1 1 1 1 1 1 1 1  3
[2,] 1 1 1 1 1 1 1 1 1 1  8
[3,] 1 1 1 1 1 1 1 1 1 1  8
[[2]][[4]]
[1,] 1 1 1 1 1 1 1 1 1 1  4
[2,] 1 1 1 1 1 1 1 1 1 1  7
[3,] 1 1 1 1 1 1 1 1 1 1  8
[4,] 1 1 1 1 1 1 1 1 1 1  4
[5,] 1 1 1 1 1 1 1 1 1 1  8
[6,] 1 1 1 1 1 1 1 1 1 1  4

person Charlie    schedule 09.08.2013    source источник


Ответы (2)


Вы ищете это?

Если вы хотите, чтобы то же самое применялось ко всем элементам списка m:

k<-lapply(m,function(x) x[x[,11] %in% c(1,3),])

> k
[[1]]
                          v1
 [1,] 1 1 1 1 1 1 1 1 1 1  1
 [2,] 1 1 1 1 1 1 1 1 1 1  1
 [3,] 1 1 1 1 1 1 1 1 1 1  3
 [4,] 1 1 1 1 1 1 1 1 1 1  1
 [5,] 1 1 1 1 1 1 1 1 1 1  3
 [6,] 1 1 1 1 1 1 1 1 1 1  1
 [7,] 1 1 1 1 1 1 1 1 1 1  1
 [8,] 1 1 1 1 1 1 1 1 1 1  3
 [9,] 1 1 1 1 1 1 1 1 1 1  1

[[2]]
                         v2
[1,] 1 1 1 1 1 1 1 1 1 1  1
[2,] 1 1 1 1 1 1 1 1 1 1  1
[3,] 1 1 1 1 1 1 1 1 1 1  3
[4,] 1 1 1 1 1 1 1 1 1 1  1
[5,] 1 1 1 1 1 1 1 1 1 1  1
person Metrics    schedule 09.08.2013
comment
Спасибо за Ваш ответ. Это было не совсем то, что я искал, но это помогло мне найти решение, которое я разместил ниже. - person Charlie; 10.08.2013

Вот решение, которое работает для меня, используя %in%:

R <- rep(list(list()),length(m)) <br/>
for(i in 1:length(m)) { <br/>
for(j in 1:length(l[[i]])) { <br/>
R[[i]][[j]] <- m[[i]][m[[i]][,dim(m[[i]])[2]] %in% l[[i]][[j]],] <br/>
}} 
person Charlie    schedule 10.08.2013