Home > Software design >  Replacing zero values in table A with non-zero values in table B if available
Replacing zero values in table A with non-zero values in table B if available

Time:06-13

I have data as follows:

tableA <- structure(c(0L, 0L, 6L, 0L, 6L, 0L, 3L, 0L, 0L), dim = c(3L, 
3L), dimnames = structure(list(c("0.3", "0.4", 
"0.6"), c("A", "B", "C")), names = c("", "")), class = "table")

      A B C
  0.3 0 0 3
  0.4 0 6 0
  0.6 6 0 0

tableB <-structure(c(0L, 1L, 2L, 0L, 3L, 0L, 3L, 2L, 0L), dim = c(3L, 
3L), dimnames = structure(list(c("0.3", "0.4", 
"0.6"), c("A", "B", "C")), names = c("", "")), class = "table")

      A B C
  0.3 0 0 3
  0.4 1 3 2
  0.6 2 0 0

I would like to replace all zeroes in tableA with positive values in tableB if they are available and somehow mark them.

What would be the easiest way to achieve this?

Desired output:

      A B C
  0.3 0 0 3
  0.4 1 6 2
  0.6 6 0 0

The added issue is that I would somehow like to know which values were replaced, but that seems difficult to realise.

CodePudding user response:

Create a logical index based on the 0 values in tableA with == and the positive values (> 0) from tableB and do the assignment

i1 <- tableA == 0 & tableB > 0
tableA[i1] <- tableB[i1]

-output

> tableA
     
      A B C
  0.3 0 0 3
  0.4 1 6 2
  0.6 6 0 0

CodePudding user response:

We can use !tableA as a mask like below

> (!tableA) * tableB   tableA

      A B C
  0.3 0 0 3
  0.4 1 6 2
  0.6 6 0 0

CodePudding user response:

Another possible solution:

ifelse(tableA == 0, pmax(tableB,0), tableA)

#>      
#>       A B C
#>   0.3 0 0 3
#>   0.4 1 6 2
#>   0.6 6 0 0

CodePudding user response:

another approach

ifelse(tableA == 0 & tableB > 0 , tableB , tableA)
  •  Tags:  
  • r
  • Related