【问题标题】:remove matrix from a list of matrices从矩阵列表中删除矩阵
【发布时间】:2021-06-24 19:22:14
【问题描述】:

我有一个名为 M 的 12 个矩阵的列表,我正在尝试从列表中删除包含 0 行的每个矩阵。

我知道我可以使用M[2] <- NULL 手动删除这些矩阵(例如,删除第二个矩阵)。我想使用逻辑来删除它们,例如:M <- M[nrow(M)>0,](但这显然不起作用)。

【问题讨论】:

    标签: r


    【解决方案1】:

    另一个可行的选项是Filter in base R

    Filter(nrow, M)
    

    之所以有效,是因为 0 被视为 FALSE,所有其他值都被视为 TRUE

    如果还有一些属性,collapse中的gv可以维护它

    library(collapse)
    gv(M, function(x) nrow(x) > 0)
    

    【讨论】:

    • 超级优雅的Filter 方法! +1!
    【解决方案2】:

    使用sapply() 获取非零矩阵的逻辑向量,然后使用该向量进行选择/子集:

    nzm <- sapply(M, function(m) nrow(m)>0)
    M <- M[nzm]
    

    【讨论】:

      【解决方案3】:

      这里是单线。

      M <- M[sapply(M, nrow) != 0]
      

      数据创建代码

      M <- lapply(1:5, function(n){
        if(n %% 2 == 0)
          matrix(nrow = 0, ncol = 2)
        else
          matrix(1:4, nrow = 2)
      })
      

      【讨论】:

        【解决方案4】:

        我认为@Akrun 有最清晰的答案。这是我在看到他之前编造的。它是可重现的,并且还解释了我使用的一种不同的处理方式,而没有考虑更优雅的解决方案。

        # create list of matrices
        matrixlist <- list(matrix(nrow=4,ncol=4,1),
             matrix(nrow=4,ncol=4,1),
             matrix(nrow=0,ncol=4,1),
             matrix(nrow=4,ncol=4,1))
        matrixlist
        
        # Identify matrices in my list that have at least one row
        idx <- lapply(lapply(matrixlist, `[`), nrow) > 0
        
        # subset the original list with this criteria
        my_revised_matrixlist <- matrixlist[idx]
        
        my_revised_matrixlist
        

        这一切都是由 Akrun 简单的Filter(nrow, matrixlist) 完成的

        【讨论】:

          【解决方案5】:

          purrr 值得一提的另一个选项是keep()discard()compact()purrr 这个包是我这些天的首选。

          library(purrr)
          
          # simplest by far
          compact(M)
          
          # probably a bit easier to remember what you did later
          keep(M, ~ nrow(.) > 0)
          discard(M, ~ nrow(.) == 0)
          

          【讨论】:

            猜你喜欢
            • 2013-07-22
            • 2020-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多