2012-04-22 261 views
4

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

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

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

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

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

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

回答

7

由於通常情況下,@DWin獲得與一個優秀的答案太早。這裏是我的簡單的頭腦發現容易理解的選擇。

您可以使用lapply遍歷列表,然後使用[操作標準子集

而不是使用[運算符作爲函數(如@DWin所示),我寧願寫一個匿名函數f在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 ... 
+0

感謝您的貢獻。儘管迪文有一個可行的解決方案,但我的回答對我來說更容易。 – djhocking 2012-04-22 20:21:57

+0

如果OP不明白我們的解決方案是完全相同的,那麼它只會延遲他對R的工作原理的理解。 (我懷疑我的速度更快,雖然在這個大小的問題上沒有任何意義。) – 2012-04-22 23:07:11

+0

這並不是說我不明白它們是相同的,只是我仍然非常重視abc編程,即使效率更高,跳到交流節目更具挑戰性。我想這只是歸結爲我更傾向於認爲編程更像安德里的解決方案。這就是說,我非常高興能通過「[」來學習TRUE「技巧」。這就是爲什麼我提高了兩個。再次感謝! – djhocking 2012-04-22 23:40:19

6

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 ... 

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

+0

太棒了,完美的工作! – djhocking 2012-04-22 20:15:44