代码之家  ›  专栏  ›  技术社区  ›  J. Doe

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

  •  2
  • J. Doe  · 技术社区  · 7 年前

    我有以下矩阵:

    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")
    

    我使用这个过滤器根据列过滤其内容 y & z 同时,我只需要一行,所以我选择了第一行。

    y 0.2表示 z

    mat[ which( mat[,"y"] == 0.1 & mat[,"z"] == 0.2 ), ] [1,]
    

    一切按预期运行并返回:

      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,]: 尺寸数量不正确

    这可能是因为第一个过滤返回一个包含两行的矩阵,而第二个过滤不返回矩阵,而只返回一个向量(只有一行的y=0.3,z=0.5)。

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   akrun    7 年前

    我们需要使用 drop = FALSE 避免强迫 vector . 检查子集的结果,

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

    A. 矢量 没有维度,这就是我们得到错误的原因。要避免这种情况,请确保使用 drop=FALSE 对于仅返回一行的边缘情况(导致尺寸标注下降)

    mat[which( mat[,"y"] == 0.3 & mat[,"z"] == 0.5), , drop = FALSE][1,]
    #   x   y   z 
    #0.5 0.3 0.5