Home > Back-end >  Add NA from one square matrix and place it in another square matrix
Add NA from one square matrix and place it in another square matrix

Time:01-15

I was wondering if it might be possible to pick the NA columns and NA rows from the d1 square matrix and place them into d2 square matrix to achieve my DESIRED, d3 square matrix?

This is a toy example, and d1 and d2 square matrices can be of any dimension. Thus a function to achieve similar NA replacements is appreciated.

m1="
a1 a2     a3   a4   a5   a6  a7  a8   a9     b1   b2     b3
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.1    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
0  0.0    0    0    0    0   NA  0.3  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.1    NA   0.0    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.3    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA"

d1 <- sapply(read.table(text=m1,h=T),as.numeric)


m2="
a1 a2     a3   a4   a5   a6 a8   a9   b2
1  2.0    1    9    4    0  0.0  3.0  1.0
0  0.1    0    0    0    0  0.0  0.0  0.0
0  0.0    7    0    0    0  0.0  0.0  0.0
0  0.0    0    5    0    0  0.0  0.0  0.0
0  0.0    0    0    0    0  0.0  0.0  0.0
0  0.0    0    0    0    0  0.0  0.0  0.0
0  0.0    0    0    3    0  0.3  0.0  0.0
0  0.0    0    0    0    0  0.0  0.1  0.0
0  0.0    8    0    6    0  0.0  0.0  0.6"

d2 <- as.matrix(read.table(text=m2,h=T))

DESIRED="
a1 a2     a3   a4   a5   a6  a7  a8   a9     b1   b2     b3
0  2.0    1    9    0    0   NA  0.0  3.0    NA   1.0    NA
0  0.1    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    7    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    5    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.0    NA   0.0    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
0  0.0    0    0    3    0   NA  0.3  0.0    NA   0.0    NA
0  0.0    0    0    0    0   NA  0.0  0.1    NA   0.0    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
0  0.0    8    0    6    0   NA  0.0  0.0    NA   0.6    NA
NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA"

d3 <- as.matrix(read.table(text=DESIRED,h=T))

CodePudding user response:

Yes. Use logical subsetting, find the NAs from matrix 1 and subset in matrix 2.

> x <- matrix(0, nrow = 5, ncol = 5)
> y <- x
> 
> x[1,2] <- NA
> x[2,3] <- NA
> x[3,5] <- NA
> 
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    0   NA    0    0    0
[2,]    0    0   NA    0    0
[3,]    0    0    0    0   NA
[4,]    0    0    0    0    0
[5,]    0    0    0    0    0
> y
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    0    0    0    0    0
[5,]    0    0    0    0    0
> 
> y[is.na(x)] <- NA
> y
     [,1] [,2] [,3] [,4] [,5]
[1,]    0   NA    0    0    0
[2,]    0    0   NA    0    0
[3,]    0    0    0    0   NA
[4,]    0    0    0    0    0
[5,]    0    0    0    0    0

CodePudding user response:

Since d1 has the correct size, copy d1 to d3 and then copy the elements of d2 into the non-NA elements of d3:

d3 <- d1
d3[!is.na(d3)] <- d2
# or a one-liner
d4 <- replace(d1, !is.na(d1), d2)
identical(d3, d4)
#> [1] TRUE
d3
#>       a1  a2 a3 a4 a5 a6 a7  a8  a9 b1  b2 b3
#>  [1,]  1 2.0  1  9  4  0 NA 0.0 3.0 NA 1.0 NA
#>  [2,]  0 0.1  0  0  0  0 NA 0.0 0.0 NA 0.0 NA
#>  [3,]  0 0.0  7  0  0  0 NA 0.0 0.0 NA 0.0 NA
#>  [4,]  0 0.0  0  5  0  0 NA 0.0 0.0 NA 0.0 NA
#>  [5,]  0 0.0  0  0  0  0 NA 0.0 0.0 NA 0.0 NA
#>  [6,]  0 0.0  0  0  0  0 NA 0.0 0.0 NA 0.0 NA
#>  [7,] NA  NA NA NA NA NA NA  NA  NA NA  NA NA
#>  [8,]  0 0.0  0  0  3  0 NA 0.3 0.0 NA 0.0 NA
#>  [9,]  0 0.0  0  0  0  0 NA 0.0 0.1 NA 0.0 NA
#> [10,] NA  NA NA NA NA NA NA  NA  NA NA  NA NA
#> [11,]  0 0.0  8  0  6  0 NA 0.0 0.0 NA 0.6 NA
#> [12,] NA  NA NA NA NA NA NA  NA  NA NA  NA NA

Note: it appears that the first element of the "desired" matrix that you posted should be 1 instead of 0.

  •  Tags:  
  • Related