簡體   English   中英

如何從R中矩陣列表中的每個矩陣中刪除列?

[英]How to remove columns from each matrix in a list of matrices in R?

我不太熟悉在R中使用list函數。這是我第一次使用矩陣列表。 我試圖從矩陣列表中的每個矩陣中刪除相同的列,但我不確定它如何與R中的索引一起工作。

現在我在列表中有8個矩陣。 每個矩陣是[120,56]。 我想從每個矩陣中刪除 17-40和49-56 因此,我最終得到了[120,24]的8個矩陣的列表。

這是我有一個矩陣列表的例子:

MatrixList <- list(maxT = matrix(1:56, 120, 56, byrow = TRUE),
        minT = matrix(1:56, 120, 56, byrow = TRUE),
        meanT = matrix(1:56, 120, 56, byrow = TRUE),
        rain24 = matrix(1:56, 120, 56, byrow = TRUE),
        rain5d = matrix(1:56, 120, 56, byrow = TRUE),
        maxT2 = matrix(1:56, 120, 56, byrow = TRUE),
        minT2 = matrix(1:56, 120, 56, byrow = TRUE),
        meanT2 = matrix(1:56, 120, 56, byrow = TRUE))

我知道這似乎是一個簡單的問題,但我是一個新手,我只是不確定如何使用for循環和內部索引的組合來刪除列。 我寧願學習如何有效地做到這一點,而不是單獨為每個矩陣做這個,然后創建列表。

任何幫助,將不勝感激。 謝謝!

通常情況下,@ DWin很早就得到了一個很好的答案。 這是我的簡單頭腦更易於理解的替代方案。

您可以使用lapply遍歷列表,然后使用[運算符]進行標准子集化。

我不喜歡使用[ operator作為函數(如@DWin建議的),而是更喜歡在lapply中編寫一個匿名函數,它看起來與您為了轉換列表中的單個元素(即子集單個矩陣)所執行的操作完全相同:

mls <- lapply(MatrixList, function(x)x[-c(17:40, 49:56), ])
str(mls)

List of 8
 $ maxT  : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ minT  : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ meanT : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ rain24: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ rain5d: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ maxT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ minT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
 $ meanT2: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...

lapply()是要使用的函數,“技巧”是使用“TRUE”作為第一個參數來獲取所有行,然后使用負索引來刪除列:

smallerMtx <- lapply(MatrixList, "[", TRUE, -c(17:40 , 49:56))
str(smallerMtx )
#------------
List of 8
 $ maxT  : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ minT  : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ meanT : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ rain24: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ rain5d: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ maxT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ minT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
 $ meanT2: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...

我想我們需要解決你是否真的要刪除行或列。 (你在第一句中說了一些列,但后來似乎在說行。你的示例/請求的數字部分建議刪除列,但也許你來自編程傳統,其中首先指定列????

暫無
暫無

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

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