[R] fusion of two matrices (numerical and logical)

Richard O'Keefe r@oknz @end|ng |rom gm@||@com
Sat Sep 19 10:54:43 CEST 2020


(1) Using 'C == TRUE' (when you know C is logical)
    is equivalent to just plain C, only obscure.
    Similarly, 'C == FALSE' is more confusing than !C.

(2) Consider B[C].  The rows of C have 2, 1, 1, 2, 1 TRUE.
    entries, so the result here *cannot* be a rectangular array.
    And whatever it is, it contains only the elements where C
    is true.

(3) You probably already knew that 'ifelse' is vectorised.
    What you may not have realised is that it preserves
    array dimensions as well.

> A <- cbind(c(1,2), c(3,4))
> B <- cbind(c(5,6), c(7,8))
> C <- cbind(c(FALSE,TRUE), c(TRUE,FALSE))
> ifelse(C, A, B)
     [,1] [,2]
[1,]    5    3
[2,]    2    8
> ifelse(C, A, 0)
     [,1] [,2]
[1,]    0    3
[2,]    2    0

Isn't it nice when the obvious code just works?


On Sun, 6 Sep 2020 at 06:18, Vivek Sutradhara <viveksutra using gmail.com> wrote:

> Hi
> I would like to get help in combining two matrices. Here is my example:
> A <- 1:20
> B <- matrix(A,nrow=5,ncol=4)
> # B is a numerical matrix
> C <- B<7
> C[4,4] <- TRUE
> # C is a logical matrix
> # if I combine A and C, I get a vector
> D1 <- A[C==TRUE]
> D1
> D2 <- A[C==FALSE]
> D2
>
> I want to get a matrix with the same dimensions as matrix A. At the
> coordinates given by the vector D1, I want to retain the values in
> matrix A. At the locations in D2, I want a zero value.
> I want to know if I can do this without using any loops.
> Thanks, Vivek
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list