[R] Conditional Evaluation

Dennis Murphy djmuser at gmail.com
Tue Sep 27 03:36:05 CEST 2011


Hi:

The problem is that in your example, you have unequal numbers of rows
in B that match the 1's pattern in A[i, ]. The function below cycles
through the rows of A and returns, for each row of A, the rows in B
that have 1's in the same columns as A[i, ]. By necessity, this
returns a list. Notice that in the last row of A, no rows of B match
its 1's pattern.

f <- function(i) {
  idx <- which(A[i, ] == 1L)

  g <- function(x) all(x[idx] == 1)
  which(apply(B, 1, g))
  }

lapply(seq_len(nrow(A)), f)
[[1]]
[1] 6

[[2]]
[1]  4  6  8 10

[[3]]
[1] 10

[[4]]
[1] 11 12 14

[[5]]
integer(0)


If you want the corresponding rows of B in each list component, then a
simple modification of the function will provide that:

f2 <- function(i) {
  idx <- which(A[i, ] == 1L)

  g <- function(x) all(x[idx] == 1)
  B[which(apply(B, 1, g)), , drop = FALSE]
  }

lapply(seq_len(nrow(A)), f2)
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    0

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    0
[2,]    1    1    1    1    0
[3,]    1    0    1    0    1
[4,]    1    1    1    0    1

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    0    1

[[4]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    1    1    1
[2,]    0    1    1    1    1
[3,]    1    0    0    1    1

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


HTH,
Dennis

On Mon, Sep 26, 2011 at 4:03 PM, Thiem  Alrik <thiem at sipo.gess.ethz.ch> wrote:
> Dear mailing list,
>
> how can I identify all those rows of matrix B which fulfill some condition based on another matrix A? More precisely,
>
> A <- matrix(c(1, 1, 0, 1, -9, 1, -9, 1, 0, 0, 1, 1, 0, -9, 1, 0, -9, 0, 1, 1, 1, -9, 1, 1, 1), ncol = 5, byrow = TRUE)
>
> B <- matrix(c(0,0,1,0,0,0,1,1,0,0,0,0,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,1,1,
> 0,1,0,1,0,1,1,0,1,1,1,1,0,1,0,0,1,1,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,1,0,1,0,0,1), ncol = 5, byrow = TRUE)
>
> Row 1 in A has value 1 on element 1, 2 and 4. Which rows in B also display this pattern? Only row 6.
> Row 2 in A has value 1 on element 1 and 3. Which rows in B also display this pattern? Rows 4, 6, 8 and 10.
> ...
> Row 5 in A ...
>
> C <- rbind(4, 6, 8, 10, ...)
>
> How can I collect together all those rows from B to create a new matrix C?
>
> Thanks a lot,
>
> Alrik
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list