【问题标题】:Matrix filtering one time returns matrix and the other time just a vector矩阵过滤一次返回矩阵,另一次返回一个向量
【发布时间】:2018-07-31 20:27:57
【问题描述】:

我有以下矩阵:

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

我正在使用此过滤器根据列 yz 过滤其内容,同时我只需要其中的一行(无论哪个),因此我将采用第一行。

一旦我将 0.1 用于 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[which(mat[, "y"] == 0.3 & mat[, "z"] == 0.5), ][1, ] 中的错误: 维数不正确

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

有没有什么办法可以超越这一点并且能够编写一些代码而无需先检查过滤的返回是一个矩阵(所以使用 [1,])还是一个向量?

【问题讨论】:

    标签: r matrix filtering


    【解决方案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
    

    vector 没有维度,这就是我们得到错误的原因。为避免这种情况,请确保将drop = FALSE 用于仅返回单行的极端情况(这会导致尺寸下降)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多