Home > database >  replace array values according to values in the first index in the first dimension
replace array values according to values in the first index in the first dimension

Time:01-18

I have an array with a few dimensions. I want to replace values according to values in the first index in the first dimension. In the example below, I want to change all values that the corresponding a1 dimension == 2. If I change only one index:

set.seed(2)
arr <- array(data=sample(1:2, 18, replace = TRUE), dim=c(3,3,2), dimnames=list(paste0("a",1:3),paste0("b",1:3),paste0("c",1:2)))
    
# replace second index according to first index of dimension 1
arr[2,,][arr[1,,]==2] <- NA

The result is as expected:

> arr
, , c1

   b1 b2 b3
a1  1  2  1
a2  1 NA  1
a3  2  2  1

, , c2

   b1 b2 b3
a1  2  2  1
a2 NA NA  2
a3  1  1  2

But if I try to change all other indexes like this:

set.seed(2)
    arr <- array(data=sample(1:2, 18, replace = TRUE), dim=c(3,3,2), dimnames=list(paste0("a",1:3),paste0("b",1:3),paste0("c",1:2)))
        
        # replace second index according to first index of dimension 1
        arr[2:3,,][arr[1,,]==2] <- NA

It doesn't work as I expect. The indexes in an array is difficult to understand. How do I do it correctly? (naturally, without changing each index separately). Thanks.

I expect the result to be:

> arr
, , c1

   b1 b2 b3
a1  1  2  1
a2  1 NA  1
a3  2 NA  1

, , c2

   b1 b2 b3
a1  2  2  1
a2 NA NA  2
a3 NA NA  2

CodePudding user response:

You can use rep to get the right indices for subsetting.

arr[2:3,,][rep(arr[1,,]==2, each=2)] <- NA

arr
#, , c1
#
#   b1 b2 b3
#a1  1  2  1
#a2  1 NA  1
#a3  2 NA  1
#
#, , c2
#
#   b1 b2 b3
#a1  2  2  1
#a2 NA NA  2
#a3 NA NA  2

Or more generally.

i <- 2:dim(arr)[1]
arr[i,,][rep(arr[1,,]==2, each=length(i))] <- NA

Or (Thanks to @jblood94 for this variant)

arr[-1,,][rep(arr[1,,]==2, each = nrow(arr) - 1)] <- NA

Or using a loop.

for(i in 2:nrow(arr)) arr[i,,][arr[1,,]==2] <- NA

CodePudding user response:

It would be

arr[2:3,,][rep(arr[1,,]==2, each = 2)] <- NA

Or, more generally, to replace all rows based on the first row:

arr[-1,,][rep(arr[1,,]==2, each = nrow(arr) - 1)] <- NA
  • Related