R 矩阵过滤一次返回矩阵,另一次仅返回向量

R 矩阵过滤一次返回矩阵,另一次仅返回向量,r,matrix,filtering,R,Matrix,Filtering,我有以下矩阵: mat <- matrix(data = c(0.2 , 0.1, 0.2 ,0.4 , 0.1, 0.2, 0.5, 0.3, 0.5), nrow = 3, ncol=3, byrow = TRUE) colnames(mat) <- c("x","y","z") 一切都按预期运行并返回: x y z 0.2 0.1 0.2 另一方面,如果我用0.3表示y,用0.5表示z mat[ which( mat[,"y"]

我有以下矩阵:

mat <- matrix(data = c(0.2 , 0.1, 0.2 ,0.4 , 0.1, 0.2, 0.5, 0.3, 0.5), nrow = 3, 
              ncol=3, byrow = TRUE)
colnames(mat) <- c("x","y","z")
一切都按预期运行并返回:

  x   y   z 
0.2 0.1 0.2 
另一方面,如果我用0.3表示
y
,用0.5表示
z

mat[ which( mat[,"y"] == 0.3 & mat[,"z"] == 0.5 ), ] [1,]
我得到以下错误:

mat中的错误[其中(mat[,“y”]==0.3和mat[,“z”]==0.5),][1,]: 尺寸数量不正确

mat[which( mat[,"y"] == 0.3 & mat[,"z"] == 0.5), , drop = FALSE][1,]
#   x   y   z 
#0.5 0.3 0.5 
这可能是因为第一个过滤返回一个包含两行的矩阵,而第二个过滤返回的不是矩阵,而是一个向量(只有一行的y=0.3,z=0.5)


是否有任何方法可以超越这一点,并且能够编写一些代码,而不必首先检查过滤返回的是矩阵(因此使用[1,])还是向量?

我们需要使用
drop=FALSE
来避免强制使用
vector
。检查子集的结果

submat <- mat[ which( mat[,"y"] == 0.3 & mat[,"z"] == 0.5 ), ]
is.matrix(submat)
#[1] FALSE

is.vector(submat)
#[1] TRUE
mat[which( mat[,"y"] == 0.3 & mat[,"z"] == 0.5), , drop = FALSE][1,]
#   x   y   z 
#0.5 0.3 0.5