R: Replace elements with NA in a matrix in corresp

2020-04-19 09:04发布

问题:

I have a large matrix, z, that I removed all values >3 and replaced with NA using:

z[z>3]<-NA

I have another matrix, y, of identical dimensions that I need to replace values with NA in positions corresponding to the locations where the elements were replaced in element z. That is, if z[3,12] was >3 and replaced with NA, I need y[3,12] to be replaced with NA too. They have the same row names if that helps.

回答1:

Just use is.na on the first matrix to select the values to replace in the second matrix.

Example:

set.seed(1)

m1 <- matrix(sample(5, 25, TRUE), 5)
m2 <- matrix(sample(5, 25, TRUE), 5)

m1[m1 > 3] <- NA
m2[is.na(m1)] <- NA
m2
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    2   NA    4    5   NA
# [2,]    1   NA    4   NA    1
# [3,]    2   NA   NA   NA   NA
# [4,]   NA   NA    4    3    4
# [5,]    2    5   NA   NA    4


回答2:

set.seed(42)
z <- matrix(rnorm(15, mean = 1), nrow = 5)
y <- matrix(0, nrow = 5, ncol = 3)

z
#           [,1]      [,2]       [,3]
# [1,] 2.3709584 0.8938755  2.3048697
# [2,] 0.4353018 2.5115220  3.2866454
# [3,] 1.3631284 0.9053410 -0.3888607
# [4,] 1.6328626 3.0184237  0.7212112
# [5,] 1.4042683 0.9372859  0.8666787
y
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0    0
# [3,]    0    0    0
# [4,]    0    0    0
# [5,]    0    0    0

# The 2D matrix can be indexed as a vector
idx <- which(z > 3)

z[idx] <- NA
y[idx] <- NA

z
#           [,1]      [,2]       [,3]
# [1,] 2.3709584 0.8938755  2.3048697
# [2,] 0.4353018 2.5115220         NA
# [3,] 1.3631284 0.9053410 -0.3888607
# [4,] 1.6328626        NA  0.7212112
# [5,] 1.4042683 0.9372859  0.8666787
y
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0   NA
# [3,]    0    0    0
# [4,]    0   NA    0
# [5,]    0    0    0


回答3:

How about:

is.na(y) <- is.na(z) <- z < 3 & !is.na(z)

or simply

is.na(y) <- is.na(z) <- z < 3

if z is guaranteed not to have missing values prior to the assignment