7

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

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

4

5 回答 5

8

Filter另一个可行的选择是base R

Filter(nrow, M)

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

如果还有一些属性,gvfromcollapse可以维护它

library(collapse)
gv(M, function(x) nrow(x) > 0)
于 2021-04-08T20:16:48.263 回答
5

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

nzm <- sapply(M, function(m) nrow(m)>0)
M <- M[nzm]
于 2021-04-08T20:08:27.423 回答
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)
})
于 2021-04-08T20:10:32.873 回答
2

我认为@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

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

于 2021-04-08T20:20:10.790 回答
0

另一个值得一提的选项purrrkeep(),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)
于 2021-04-09T21:51:42.860 回答