R 使用另一个逻辑矩阵在矩阵中设置NA

R 使用另一个逻辑矩阵在矩阵中设置NA,r,indexing,na,R,Indexing,Na,我刚刚看到一个看起来非常好的问题被删除了,因为和原来的提问者一样,我找不到重复的问题,所以我再次发帖 假设我有一个简单的矩阵(“m”),我想用另一个逻辑矩阵(“I”)对其进行索引,保持原始矩阵结构不变。大概是这样的: # original matrix m <- matrix(1:12, nrow = 3, ncol = 4) # logical matrix i <- matrix(c(rep(FALSE, 6), rep(TRUE, 6)), nrow = 3, ncol =

我刚刚看到一个看起来非常好的问题被删除了,因为和原来的提问者一样,我找不到重复的问题,所以我再次发帖

假设我有一个简单的矩阵(“m”),我想用另一个逻辑矩阵(“I”)对其进行索引,保持原始矩阵结构不变。大概是这样的:

# original matrix
m <- matrix(1:12, nrow = 3, ncol = 4)

# logical matrix
i <- matrix(c(rep(FALSE, 6), rep(TRUE, 6)), nrow = 3, ncol = 4)

m
i

# Desired output:
matrix(c(rep(NA,6), m[i]), nrow(m), ncol(m))
# however this seems bad programming...
原始矩阵
原始海报添加了一条评论,说他已经想出了解决方案,然后几乎立即将其删除:

 m[ !i ] <- NA 

m[!i]两种解决方案都提供了上述工作,并且都很好。这里是另一个生成新矩阵的解决方案,无需修改前一个矩阵。确保您的逻辑值矩阵存储为逻辑,而不是字符

vm <- as.vector(m)
vi <- as.vector(i)
new_v <- ifelse(vi, vm, NA)
new_mat <- matrix(new_v, nrow = nrow(m), ncol=ncol(m))

vm我打算根据指定的结果以及他的解决方案和我的备选方案都给出了相同的结果来分配NA。我猜简单地创建一个可以修改的副本会更简单、更快。
ifelse
需要创建3个与原始矩阵长度相同的对象,然后对第四个进行赋值。当然可以。总是有不同的方法去做。我只是想再举一个例子,说明如何一步一步地解决这个问题。(初学者有时更容易理解)。
vm <- as.vector(m)
vi <- as.vector(i)
new_v <- ifelse(vi, vm, NA)
new_mat <- matrix(new_v, nrow = nrow(m), ncol=ncol(m))