簡體   English   中英

從矩陣列表中刪除矩陣

[英]remove matrix from a list of matrices

我有一個名為M的 12 個矩陣的列表,我試圖從列表中刪除每個有 0 行的矩陣。

我知道我可以手動刪除這些矩陣(例如,刪除第二個矩陣) M[2] <- NULL 我想使用邏輯來刪除它們,例如: M <- M[nrow(M)>0,] (但這顯然不起作用)。

另一個可以工作的選項是base R中的Filter

Filter(nrow, M)

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

如果還有一些屬性, gv from collapse可以保持它

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

使用sapply()獲取非零矩陣的邏輯向量,然后使用該向量來選擇/子集:

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

這是一個單線。

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

我認為@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)完成的

purrr值得一提的另一個選項是keep()discard()compact() package 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM